我有一个实体Map到一个表。这个表通常在Map的属性之上有一些列。例如,如果实体定义为:
@Entity
class MyEntity {
private String a;
}
然后该表有列a
。在一个模式中,它还可能有列b
和c
,在另一个d
,e
和f
中。我认为重写EntityManager
的load
方法来加载MyEntity
中定义的所有属性并随后将所有其他属性加载到Map<String, Object>
中会很简单,但是我找不到一个方法来实现它。以下是我到目前为止所考虑的:
1.我找到了this SO question,这导致了this的帖子,它可能解决了这个问题,但需要在启动时加载Map,这并没有解决我的问题,因为我经常在模式之间切换,因此必须一遍又一遍地重新加载Map。
1.重写RelationalMappingContext也假定一个常量模式。
1.应该有一种方法将EntityManager
作为bean提供,但我不知道如何实现,我不确定这是否会遇到与1和2相同的问题。
1.我可以做一些复杂的字节码操作,但这需要每个模式都有一个实体,这太复杂了。
1.所以我不得不考虑覆盖CrudRepository
中的所有方法,并提供自己的实现,这将是非常笨拙的。
还有别的主意吗?
1条答案
按热度按时间pbpqsu0x1#
在这种情况下你有两个选择
1.使用NoSQL数据库:如果你需要频繁地动态添加列,你可以考虑使用支持动态模式的NoSQL数据库。像MongoDB这样的NoSQL数据库旨在处理动态数据,并允许你存储文档或键值对,而无需强制执行固定模式。
1.使用JSON或XML列:一些数据库如PostgreSQL或MySQL支持JSON或XML列,可以存储半结构化数据。您可以将动态数据存储为单个列中的JSON或XML文档,并使用SQL或类似NoSQL的查询进行查询。
例如,如果你使用PostgreSQL,你可以在my_table表中定义一个JSON列,如下所示:
然后,您可以将JSON文档插入到dynamic_data列中,并使用PostgreSQL的JSON函数查询它们。
或者,您可以使用Hibernate的@Type注解将JSON或XML列Map到Java对象。例如: