spring 如果事先只知道表模式的一部分,如何从关系数据库中加载实体?

exdqitrt  于 2023-03-22  发布在  Spring
关注(0)|答案(1)|浏览(109)

我有一个实体Map到一个表。这个表通常在Map的属性之上有一些列。例如,如果实体定义为:

@Entity
class MyEntity {
  private String a;
}

然后该表有列a。在一个模式中,它还可能有列bc,在另一个def中。我认为重写EntityManagerload方法来加载MyEntity中定义的所有属性并随后将所有其他属性加载到Map<String, Object>中会很简单,但是我找不到一个方法来实现它。以下是我到目前为止所考虑的:
1.我找到了this SO question,这导致了this的帖子,它可能解决了这个问题,但需要在启动时加载Map,这并没有解决我的问题,因为我经常在模式之间切换,因此必须一遍又一遍地重新加载Map。
1.重写RelationalMappingContext也假定一个常量模式。
1.应该有一种方法将EntityManager作为bean提供,但我不知道如何实现,我不确定这是否会遇到与1和2相同的问题。
1.我可以做一些复杂的字节码操作,但这需要每个模式都有一个实体,这太复杂了。
1.所以我不得不考虑覆盖CrudRepository中的所有方法,并提供自己的实现,这将是非常笨拙的。
还有别的主意吗?

pbpqsu0x

pbpqsu0x1#

在这种情况下你有两个选择
1.使用NoSQL数据库:如果你需要频繁地动态添加列,你可以考虑使用支持动态模式的NoSQL数据库。像MongoDB这样的NoSQL数据库旨在处理动态数据,并允许你存储文档或键值对,而无需强制执行固定模式。
1.使用JSON或XML列:一些数据库如PostgreSQL或MySQL支持JSON或XML列,可以存储半结构化数据。您可以将动态数据存储为单个列中的JSON或XML文档,并使用SQL或类似NoSQL的查询进行查询。
例如,如果你使用PostgreSQL,你可以在my_table表中定义一个JSON列,如下所示:

ALTER TABLE my_table ADD COLUMN dynamic_data jsonb;

然后,您可以将JSON文档插入到dynamic_data列中,并使用PostgreSQL的JSON函数查询它们。
或者,您可以使用Hibernate的@Type注解将JSON或XML列Map到Java对象。例如:

@Entity
@Table(name = "my_table")
public class MyEntity {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @Type(type = "jsonb")
   @Column(columnDefinition = "jsonb")
   private Map<String, Object> dynamicData;

}

相关问题