【发布时间】:2011-01-07 20:26:47
【问题描述】:
假设提供了以下映射:
<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... 转换为 <property...,这将起作用,但数据库不会强制执行外键。
我需要这样做,因为对象 B 可能(或可能不会)单独初始化,这有时会导致
调用a.getB() 时会发生org.hibernate.LazyInitializationException: could not initialize proxy - no Session 异常。我更愿意将它作为long idOfB 并在必要时加载整个对象;这也将使对象A 的加载更快。
我相信我的问题与this one 非常相似,但所提供的解决方案(使用延迟加载)在我的情况下并不合适,因为即使我调用a.getB().getId(),我也会得到LazyInitializationException 而如果我打电话给a.getIdOfB()我不会。
非常感谢。
【问题讨论】:
-
我强烈建议使用 LazyLoading 而不是重新发明轮子。您将获得类型安全的实体类、完全相同的性能,并且可能会取消自定义重新加载代码。请注意,如果使用不正确,即如果在会话关闭后请求延迟加载,则 LazyLoading 只会导致 LazyLoadingException。另请注意,请求对象的 id 不会导致对象被加载。我建议您发布一个关于您在使用 LazyLoading 时遇到的具体问题的问题。
-
相信我,我确实使用 LazyLoading。这只是我做不到的数百个案例中的一个。否则我不会问。
标签: java hibernate foreign-keys hibernate-mapping