【问题标题】:TABLE_PER_CLASS Bidirectional @OneToMany ProblemTABLE_PER_CLASS 双向@OneToMany 问题
【发布时间】:2011-03-10 18:09:36
【问题描述】:

Hibernate 可以使用 TABLE_PER_CLASS (<union-subclass>) 进行双向多态性,here 这么说:

此策略支持一对多关联,前提是它们是双向的。

我试图让一个简单的例子起作用。 4 个基本类:abstract A B C 和 A D,其中 D 持有 B 的 myArray

我没有错误; myArray 是空的。

详情

一个

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Class_A {
    @Id
    public int myId = 0;
    public int a = 0;
}

B

@Entity
public class Class_B extends Class_A {
    public int b = 0;

    @ManyToOne
    @JoinColumn(name="join_column_b")
    private Class_D class_d;
}

C

@Entity
public class Class_C extends Class_B {
    public int c = 0;
}

D

@Entity
public class Class_D extends Class_A {
    @OneToMany(cascade=CascadeType.ALL, mappedBy="class_d", fetch=FetchType.EAGER)
    public List<Class_B> myArray;

    public Class_D() {
        myArray = new ArrayList<Class_B>();
    }
}

代码

// Definition.
Class_B b = new Class_B(); b.myId =  9;
Class_C c = new Class_C(); c.myId = 18;
Class_D d = new Class_D(); d.myId = 92;
d.myArray.add(b);
d.myArray.add(c);

// Saving.
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(d);
session.getTransaction().commit();
session.close();

// Loading.
Session session2 = sessionFactory.openSession();
session2.beginTransaction();
Class_D d2 = (Class_D)session2.createQuery("from " + Class_D.class.getName()).uniqueResult();
session2.getTransaction().commit();
session2.close();

在调试器中,我可以比较实例 dd2(它们不是同一个实例,但具有相同的 myId)。 d2 有一个空的 myArray

没有例外 - 没有 Oracle 错误 - 没有任何东西

为什么?

注意事项:
1. Hibernate 3.6.0 Final + Oracle 11g + 纯Java
2. 使用注解
3. 我已经查看了 thisthis,但仍然无法让这个简单的示例运行 (ffs!)
4. 下周日我会更新 - 如果我在那之前没有回复,请原谅我

【问题讨论】:

    标签: hibernate polymorphism one-to-many


    【解决方案1】:

    将关系保存到数据库时,Hibernate 会查看拥有方。对于双向一对多关系,拥有方是“多”,即在您的情况下为Class_B

    因此数据库反映了Class_B.class_d的状态,在将Class_B关联到Class_D时应该设置它的值(最好创建一个同时设置两边的方法):

    public class Class_D {
        ...
        public void addToMyArray(Class_B class_b) {
            myArray.add(class_b);
            class_b.setClass_D(this);
        }
    }
    
    d.addToMyArray(b);
    d.addToMyArray(c);
    

    【讨论】:

    • 谢谢!奇迹般有效。出于某种原因,我认为 Hibernate 自动建立了关系......
    猜你喜欢
    • 2013-06-17
    • 2015-03-10
    • 2020-06-26
    • 1970-01-01
    • 2011-06-25
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    相关资源
    最近更新 更多