1

我遇到了休眠删除两个对象之间的关系的问题。第一个是:

    @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 语句之后。这将删除对象与其子对象之间的所有关系。如果我更改FetchTypeB“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()不会改变任何事情。所以我很困惑,因为一切都突然发生了。所以作为一个结论,我的应用程序现在可以使用这个“修复”。但如果有人能给我一个更通用的解决方案,我将不胜感激。

4

1 回答 1

0

由于您已hibernate.enable_lazy_load_no_trans启用并且该错误仍然存​​在,我猜您是HHH-7971的受害者。我无法为您提供适当的解决方案,如果该行为是此错误的结果,您可以使用解决方法来修复它。

我想可以a.size()解决这个问题,因为 Hibernate 代理在那一刻被初始化。所以使用Hibernate.initialize(a). 我也不会在吸气剂中这样做,而是在你调用吸气剂的地方。

于 2013-08-28T10:07:48.997 回答