一尘不染

没有对象到对象的映射,是否可以强制执行外键?

hibernate

假设提供了以下映射:

<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如下所示:

public class A {
   private long id;
   private long idOfB;
   // getters and setters skipped
}

我知道,如果我将其转换<many-to-one...为a <property...可以使用,但是数据库不会强制使用外键。

我需要执行此操作,因为对象B可能会(或可能不会)单独初始化,这有时会导致
org.hibernate.LazyInitializationException: could not initialize proxy - no Sessiona.getB()调用时发生异常。我希望将其作为,long idOfB并在必要时加载整个对象。这也将使对象的加载A更快。

我相信我的问题与这一问题非常相似,但是所提供的解决方案(使用延迟加载)不适用于我的情况,即使我打电话给a.getB().getId()LazyInitializationException,但如果我打电话给a.getIdOfB()我就不行。

首先十分感谢。


阅读 246

收藏
2020-06-20

共1个答案

一尘不染

如前所述

我知道,如果将<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”。

问候,

2020-06-20