Hibernate наследование - PullRequest
       20

Hibernate наследование

5 голосов
/ 24 февраля 2012

Я работаю над проектом с 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();
    }
}

Я хочу, чтобы пациент унаследовал личную личность, как это можно решить?

Т.е. после создания личной беседы я хочу подключить пациента к личному совещанию.

Ответы [ 2 ]

8 голосов
/ 24 февраля 2012

Обычно я не рекомендую людям использовать наследование / полиморфизм в Hibernate, и это яркий пример того, почему.Какую дополнительную ценность вы получаете от создания этого наследства, которое перевешивает сложность, которую оно создает?Разве не проще было бы просто иметь одну сущность для Персоны и одну для Пациента и заставить Пациента содержать человека, то есть иметь отношения М-1 с человеком?

Сохранить егопросто, особенно с Hibernate.Реляционные базы данных не предназначены для обработки наследования, они предназначены для обработки отношений, так зачем насильно превращать их в то, для чего они не предназначены?

3 голосов
/ 24 февраля 2012

Вы пропустили аннотацию

@PrimaryKeyJoinColumn(name="persoonsnummer")

из вашего Patient класса.

Это говорит Hibernate о том, что в вашей личной таблице есть столбец persoonsnummer, который служит уникальным идентификатором, и что в таблице пациентов также есть persoonsnummer, который служит для связи строки пациента с соответствующей строкой человека.

Обратите внимание, что если в вашей схеме нет столбца persoonsnummer в таблице пациентов (с таким же определением, что и в соответствующем столбце таблицы персон), вам нужно будет добавить один.

Кроме того, чтобы создать нового пациента с помощью Hibernate, вам НЕ нужно создавать объект Person. Класс Patient расширяет Person, поэтому вы можете установить все поля для Patient и Person непосредственно в нем. Когда вы используете Hibernate для сохранения пациента, он создает в базе данных строку как пациента, так и человека.

...