Java 使用继承休眠集合

Java 使用继承休眠集合,java,hibernate,Java,Hibernate,我的案例是一个表格,有类别,问题,答案。。。一个表单有不同的类别,每个类别都有不同的问题,这个问题有一个或多个可能的答案 在java的imnplementation中,我有一个名为TreeObject的对象,它实现了元素之间的所有关系(以及其他公共属性,如创建日期…)。此对象有一个子对象列表和一个父对象,以遵循表单的层次结构。然后,Category、Form和其他元素扩展了这个类并添加了一些额外的功能 数据库将是一个包含所有公共数据(树对象)、子对象和父关系的表,以及一些包含每个表的特定数据的其

我的案例是一个表格,有类别,问题,答案。。。一个表单有不同的类别,每个类别都有不同的问题,这个问题有一个或多个可能的答案

在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);
}