我遇到了休眠删除两个对象之间的关系的问题。第一个是:
@Entity
@Table(name="A")
public class A extends AbstractBO{
private List<B> b;
@Override
@Id
public String getId(){
return id;
}
public void setId(String id) {
this.id = id;
}
@ManyToMany(targetEntity=B.class, fetch=FetchType.LAZY)
@JoinTable(name="A_B", joinColumns={@JoinColumn(name="A_id")},inverseJoinColumns={@JoinColumn(name="B_id")})
public List<B> getBs() {
return b;
}
public void setBs(List<B> b) {
this.b = b;
}
}
第二个:
@Entity
@Table(name="B")
public class B extends AbstractBO {
private List<A> a;
@Override
@Id
public String getId(){
return id;
}
public void setId(String id) {
this.id = id;
}
@ManyToMany(targetEntity=A.class, fetch=FetchType.LAZY, mappedBy="b")
public List<A> getAs() {
return a;
}
public void setAs(List<A> a) {
this.a = a;
}
}
我的 hibernate.cfg.xml 是:
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">****</property>
<property name="hibernate.connection.release_mode">auto</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="hibernate.enable_lazy_load_no_trans">true</property>
<property name="hibernate.generate_statistics">false</property>
<property name="transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</property>
<property name="hibernate.cache.provider_class">
org.hibernate.cache.HashtableCacheProvider
</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">2</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="de.test.A"/>
<mapping class="de.test.B"/>
</session-factory>
</hibernate-configuration>
到目前为止,一切正常。可以保存、更新、删除和加载持久存在于数据库中的所有对象及其所有子对象。如果我正在加载一个类型的对象,包括在前端A
调用,我会得到正确的对象并显示它的所有子对象。getBs()
但是休眠会执行“休眠:从 B_id= 的 A_B 中删除?” 紧跟在 SELECT 语句之后。这将删除对象与其子对象之间的所有关系。如果我更改FetchType
为B
“EAGER”,一切正常。看来,休眠消除了事实,即getAs()
没有调用子对象的事实。
我还尝试将getAs()
课程更改B
为:
@JoinTable(name="A_B", joinColumns={@JoinColumn(name="B_id")}, inverseJoinColumns={@JoinColumn(name="A_id")})
public List<A> getAs() {[...]
顺便说一句,我正在使用:
- 休眠 4.2.4 最终版
- JSF 2.0
- JPA 2.0
我已经阅读了许多相关文章并尝试了 Cascade 等不同的建议。我还考虑过调用getAs()
的构造函数B
,但所有这些都不能解决我的问题。
在调试我的应用程序时,我在类的 getter 中添加了一行B
:
public List<A> getAs() {
if(a!=null) a.size();
return a;
}
打电话a.size()
不会改变任何事情。所以我很困惑,因为一切都突然发生了。所以作为一个结论,我的应用程序现在可以使用这个“修复”。但如果有人能给我一个更通用的解决方案,我将不胜感激。