Hibernate可以使用TABLE_PER_CLASS
(<union-subclass>
)执行双向多态,这样说here:
此策略支持一对多关联,前提是它们是双向的。
我正在尝试一个简单的例子。 4个基本类:抽象 A &lt; - B &lt; - C 和 A < / strong>&lt; - D ,其中D持有B的myArray
。
我没有错误; myArray
只是空的。
A
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Class_A {
@Id
public int myId = 0;
public int a = 0;
}
乙
@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();
在调试器中,我可以将实例d
与d2
进行比较(它们不是同一个实例,但具有相同的myId
)。 d2
有一个空的myArray
。
没有例外 - 没有Oracle错误 - 没有任何内容
为什么?
注意:
1. Hibernate 3.6.0 Final + Oracle 11g + pure Java
2.使用注释
3.我已经审核了this和this,但仍然无法让这个简单的例子起作用( ffs!)
我星期天可以在下一次更新 - 如果我在那之前没有回复,请原谅我
答案 0 :(得分:2)
当保存与数据库的关系时,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);