假设提供了以下映射:
<class name="A" table="a_table"> <id name="id"/> <many-to-one name="entityB" column="fk_B" not-null="false" unique="true"/> </class> <class name="B" table="b_table"> <id name="id"/> </class>
Java类:
public class A { private long id; private B entityB; // getters and setters skipped }
是否可以更改Hibernate映射,以便 在启动时仍由Hibernate强制并创建外键 ,但类A如下所示:
A
public class A { private long id; private long idOfB; // getters and setters skipped }
我知道,如果我将其转换<many-to-one...为a <property...可以使用,但是数据库不会强制使用外键。
<many-to-one...
<property...
我需要执行此操作,因为对象B可能会(或可能不会)单独初始化,这有时会导致 org.hibernate.LazyInitializationException: could not initialize proxy - no Session在a.getB()调用时发生异常。我希望将其作为,long idOfB并在必要时加载整个对象。这也将使对象的加载A更快。
B
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
a.getB()
long idOfB
我相信我的问题与这一问题非常相似,但是所提供的解决方案(使用延迟加载)不适用于我的情况,即使我打电话给a.getB().getId()我LazyInitializationException,但如果我打电话给a.getIdOfB()我就不行。
a.getB().getId()
LazyInitializationException
a.getIdOfB()
首先十分感谢。
如前所述
我知道,如果将<many-to-one …转换为<property …,这可以工作, 但是 数据库 不会强制使用外键 。
所以我的建议是:同时 使用
public class EntityA { private Integer idOfB; private EntityB entityB; // getter's and setter's }
和
<class name="A" table="a_table"> <id name="id"/> <property name="idOfB" column="fk_B" not-null="false" unique="true"/> <many-to-one name="entityB" update="false" insert="false" column="fk_B"/> </class>
请注意,当两个属性共享同一列时, 您仅需将其设置放在一个属性中 。否则,Hibernate将抱怨一些错误。它解释了为什么我在entityB属性中定义update =“ false”和insert =“ false”。
问候,