Java 使用继承休眠集合
我的案例是一个表格,有类别,问题,答案。。。一个表单有不同的类别,每个类别都有不同的问题,这个问题有一个或多个可能的答案 在java的imnplementation中,我有一个名为TreeObject的对象,它实现了元素之间的所有关系(以及其他公共属性,如创建日期…)。此对象有一个子对象列表和一个父对象,以遵循表单的层次结构。然后,Category、Form和其他元素扩展了这个类并添加了一些额外的功能 数据库将是一个包含所有公共数据(树对象)、子对象和父关系的表,以及一些包含每个表的特定数据的其他表(表单、类别等)。为此,我使用了Java 使用继承休眠集合,java,hibernate,Java,Hibernate,我的案例是一个表格,有类别,问题,答案。。。一个表单有不同的类别,每个类别都有不同的问题,这个问题有一个或多个可能的答案 在java的imnplementation中,我有一个名为TreeObject的对象,它实现了元素之间的所有关系(以及其他公共属性,如创建日期…)。此对象有一个子对象列表和一个父对象,以遵循表单的层次结构。然后,Category、Form和其他元素扩展了这个类并添加了一些额外的功能 数据库将是一个包含所有公共数据(树对象)、子对象和父关系的表,以及一些包含每个表的特定数据的其
InheritanceType.JOINED
树对象类的代码(更新为包含@kostja注释):
DAO有这种方法(我使用泛型来简化代码,但代码可以读取):
类别、问题和其他元素与Form类非常相似。我跳过了它们
问题是子列表未正确持久化。例如,下一个测试失败,因为getChildren().size()为0而不是1(但其他表单值检索正确,只有子列表为空):
如果我将子列表的代码移动到Form类中,它将正常工作,并且测试通过。但是父类中的列表不起作用。我不明白为什么,唯一的区别是继承的使用 通过移除接口,问题得以解决。我已经读到hibernate不能处理intefaces,这就是为什么children参数不能用接口实现的原因。删除接口实现并更改一些setter和getter方法(如getChildren)以使用TreeObject可以解决此问题。我认为不使用DAO接口就足以解决这个问题。但是似乎对象的getter和setter也不能使用接口 可能,当我复制到Form对象时,我没有使用该接口作为快速复制粘贴,这就是为什么在这种情况下可以正常工作的原因
@Entity
@Table(name = "TREE_OBJECTS")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class TreeObject implements ITreeObject {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "ID", unique = true, nullable = false)
private Long id;
@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER)
@JoinTable(name = "CHILDRENS_RELATIONSHIP")
private List<TreeObject> children;
@ManyToOne(fetch = FetchType.EAGER)
private TreeObject parent;
//More parameters, getters and setters.
}
@Entity
@Table(name = "FORMS")
public class Form extends TreeObject {
private String name;
//setters, getters and other stuff.
}
public T makePersistent(T entity) {
setCreationInfo(entity);
setUpdateInfo(entity);
Session session = getSessionFactory().getCurrentSession();
session.beginTransaction();
try {
session.saveOrUpdate(entity);
session.flush();
session.getTransaction().commit();
return entity;
} catch (RuntimeException e) {
session.getTransaction().rollback();
throw e;
}
}
@Test
public void storeFormWithCategory() throws NotValidChildException {
Form form = new Form();
form.setName("Test Form");
Category category = new Category();
form.addChild(category);
formDao.makePersistent(form);
Form retrievedForm = formDao.read(form.getId());
Assert.assertEquals(retrievedForm.getId(), form.getId());
Assert.assertEquals(retrievedForm.getChildren().size(), 1);
}