是否可以在没有对象到对象映射的情况下强制执行外键?

min*_*das 6 java hibernate foreign-keys hibernate-mapping

假设提供了以下映射:

<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>
Run Code Online (Sandbox Code Playgroud)

Java类:

public class A {
   private long id;
   private B entityB;
   // getters and setters skipped
}
Run Code Online (Sandbox Code Playgroud)

是否可以更改Hibernate映射,以便Hibernate在启动时仍然强制执行和创建外键,但类A看起来如下所示:

public class A {
   private long id;
   private long idOfB;
   // getters and setters skipped
}
Run Code Online (Sandbox Code Playgroud)

我明白,如果我转换<many-to-one...成一个<property...可以工作,但数据库不会强制执行外键.

我需要这样做,因为对象B可能(或可能不)单独初始化,这有时会导致 org.hibernate.LazyInitializationException: could not initialize proxy - no Sessiona.getB()调用时发生异常.我宁愿把它作为一个long idOfB并在必要时加载整个对象; 这也可以A加快物体的加载速度.

我相信我的问题与这个问题非常相似,但提供的解决方案(使用延迟加载)在我的情况下是不合适的,即使我打电话a.getB().getId(),我会得到LazyInitializationException,如果我打电话,a.getIdOfB()我不会.

首先十分感谢.

Art*_*ald 11

如上所述

我理解,如果我将<many-to-one ...转换为<property ...这将会起作用,数据库不会强制执行外键.

所以我的建议是:同时使用两者

public class EntityA {

    private Integer idOfB;

    private EntityB entityB;

    // getter's and setter's

}
Run Code Online (Sandbox Code Playgroud)

<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>
Run Code Online (Sandbox Code Playgroud)

请注意,当两个属性共享同一列时,您必须将其设置只放在一个属性中.否则,Hibernate会抱怨一些错误.它解释了为什么我在entityB属性中定义update ="false"和insert ="false".

问候,