Java 冬眠遗传

Java 冬眠遗传,java,database,hibernate,inheritance,Java,Database,Hibernate,Inheritance,我正在用hibernate做一个项目。 我得到了这两个文件: Persoon.java @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name = "PROJ_TYPE") @Table(name = "PROJECT") public class Persoon { @Id @GeneratedValue protected int persoonsnummer

我正在用hibernate做一个项目。 我得到了这两个文件:

Persoon.java

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "PROJ_TYPE")
@Table(name = "PROJECT")
public class Persoon {

    @Id
    @GeneratedValue
    protected int persoonsnummer;
    protected String voornaam;
    protected String achternaam;
    protected String adres;
    protected String geboortedatum;
    protected String telefoonnummer;
    protected String titel;

    // Getters and setters ommited for brevity
}
Patient.java

@Entity
@DiscriminatorValue("P")
@Table(name="PATIENT")
public class Patient extends Persoon implements Serializable {   

    protected String allergieen;
    protected String bijzonderheden;

    // Getters and setters ommited for brevity
}
和Test.java来填充表格:

public class Test {
    public static void main(String[] args) {
        // get a session
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        // Start a tx
        session.beginTransaction();
        // create a person
        Persoon i = new Persoon();
        i.setVoornaam("Henk");
        i.setAchternaam("Oliebol");
        i.setAdres("1234AA Rotterdam");
        i.setGeboortedatum("10-10-1990");
        i.setTelefoonnummer("012345678");
        i.setTitel("Patient");
        session.save(i);

        // create a patient
        Patient p = new Patient();
        p.setAllergieen("geen");
        p.setBijzonderheden("geen");
        session.save(p);// create another car

        // commit the tx, 
        // so that it will be visible in the db
        session.getTransaction().commit();
    }
}
我要病人继承人,解决这个问题的办法是什么


也就是说,在制作persoon之后,我想将患者与persoon连接起来。

我通常不鼓励人们在Hibernate中使用继承/多态性,这就是一个主要的例子。您从创建此继承中获得了哪些超过其产生的复杂性的附加值?一个实体对应一个人,一个实体对应一个患者,并让患者包含一个人,即与一个人建立M-1关系,难道不是更容易吗


保持简单,尤其是使用Hibernate。关系数据库不是用来处理继承的,它们是用来处理关系的,那么为什么要将其强制为不适合的对象呢?

您缺少注释

@PrimaryKeyJoinColumn(name="persoonsnummer")
从您的
患者
课程

这告诉Hibernate,您的person表有一个
PersoonSummer
列作为唯一的id,而patient表也有一个
PersoonSummer
,用于将患者行链接到相应的person行

注意,如果在您的模式中,患者表上没有
Persoonsummer
列(定义与person表上的相应列完全相同),则需要添加一个


此外,为了使用Hibernate创建新患者,您不必同时创建Person对象。Patient类扩展了Person,因此可以直接在其上设置Patient和Person的所有字段。当您使用Hibernate保存患者时,它将在数据库中创建一个“患者”和“人员”行。

您真的需要在此处继承患者吗?仅仅定义一对一的关系不是更好吗?你想要两种不同的东西空间已经扩展了。你到底想要什么?你说的“连接”是什么意思?我大体上同意你的看法,但我认为说一个人永远不应该这样做是不公平的。Hibernate支持这种继承是有原因的,而且在某些情况下,使用Hibernate冒一点复杂性的风险将在其他地方节省大量复杂性。@JeffGoldberg—“有原因”是一个强有力的假设,特别是在其核心是开源的情况下。同样可能的是,它的存在是因为其中一个贡献者只是为了实现它而想实现它。但可以肯定的是,在某些情况下,它可能是有用的。我现在想不出一个,我必须承认,但是是的。我碰巧用过它,而且非常喜欢它。主要的情况是,我有一个父母从来没有单独使用。。。它总是和孩子一起使用。在这种情况下,它可以自动创建/更新/删除父对象,就像它们是一个一样,这是一件好事。