1

我有两个实体,它们之间存在多对一关系。许多 B 实体与 A 实体相关。我的 B 表有一A_ID列。在某些情况下,我们可能有一个 B 实体,它有一个A_ID但与 A 中的任何行都不相关。我知道这并不理想,但它是旧系统的一部分,我们无法真正触及这部分代码.

setA()使用适当的 Hibernate 实体,当我们有一个 A 实体要使用 B 的方法和 B 的方法关联时,我可以添加 B 实体getAs().add()。我没有看到任何方法来处理我想添加一个不与 A 实体关联的 B 实体(A_ID = 10例如,B's 没有 A 和 a 的情况ID = 10)的情况。这是可能的,还是我在这一点上打破了我们的实体层次结构并手动处理它?

有什么方法可以将 a 添加setAId()到 B 实体并使用该方法或该setA()方法,但不能同时使用两者?Hibernate 会允许这样做吗?当我尝试在 B 上添加 getter 和 setter 时,出现以下错误:

MyHibernateException: Hibernate SessionFactory creation failed, hibernateCfgFileNm=hibernate.xml
...
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: test.B column: A_ID (should be mapped with insert="false" update="false")

抱歉没有提供代码。我认为这个解释就足够了,但是如果需要代码,我可以添加它。

4

1 回答 1

1

根据我对实体关系的理解(我假设您将这些与标准 JPA @ManyToOne/@OneToMany关系映射?)我相信您会在这里遇到一些有趣的问题。

我将使用序列生成的 ID 创建我的 A 实体,并允许“占位符”A 实体除了携带旧系统中的 A_ID 之外什么都不做。只需让您的代码意识到并非每个 A 实体都是完整的实体(它可能只是放置您上面提到的那些 A_ID)并优雅地处理它,允许您始终提供一个 A 实体,其 ID 与遗留系统分离.

我认为您无法将关系映射到同一列并在该列中设置值而不会导致关系出现问题——除非您将关系标记为LAZYfetch 并捕获必然会发生的异常当它尝试解析不存在的实体 A 时。这也可能有效 - 在这种情况下,尝试将关系列映射为只读 ( insert="false" update="false"),并使用setAId(id). 您可能需要让您的setA(A)方法仅对 ID 而非托管集合进行操作,因为读取集合本质上会获取任何相关行。

如果遗留 ID 的语义松散地转换为“这里,此 ID 可能是空对象”,则最好的办法是与遗留系统的 ID 分离。

于 2013-05-15T20:46:52.420 回答