Как сохранить в базе данных класс иерархии?

1

Я использую Java и Hibernate для сохранения моих объектов в базе данных, но он не работает по мере необходимости. У меня есть компания Entreprise:

@Entity
public class Entreprise{

@Id
private long identifier;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Person>  persons;

...
// getters and setters

} 

Здесь объект Person, который является суперклассом других объектов:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Person{

@Id
private long identifier;

@Column
private String name;

...
 // constructors,getter and setter

} 

И мои два подкласса:

@Entity
public class Employed extends Person{

 @Column
 private String actualJob;

 // constructors,getter and setter
}


@Entity
public class Unemployed extends Person{

 @Column
 private String lastJob;

// constructors,getter and setter
}

Здесь мой метод сохранения объекта в базе данных:

Person person = new Employed();
person.setName("John");
Employed employed = (Employed) person;
employed.setActualJob("electrician");
Entreprise myEntreprise = new Entreprise();
entreprise.getPersons().addPerson(person);
entrepriseDao.save(entreprise);

Но в базе данных вставка была сделана только в таблице Entreprise и Person. Ничего не было вставлено в таблицу Employed. Я не знаю, почему, если бы кто-нибудь мог мне объяснить, пожалуйста?

Я стараюсь, чтобы следующий код не работал:

Employed employed = new Employed();
employed.setActualJob("electrician");
employed.setName("John");
Entreprise myEntreprise = new Entreprise();
entreprise.getPersons().addPerson(employed);
entrepriseDao.save(entreprise);

Я не понимаю, почему, даже если я использую подкласс для установки данных, он не работает.

Вот ddl

Hibernate: insert into Entreprise_Person (Entreprise_identifier, person_identifier) values (?, ?);
  • 0
    Пожалуйста, покажите DDL SQL.
Теги:
hibernate
inheritance

2 ответа

0

Попробуйте добавить @PrimaryKeyJoinColumn(name = "YOUR_SUBCLASS_ID_FIELD_THAT_WILL_MATCH_THE_SUPERCLASS_ID_FIELD") ко всем подклассам.

Подклассам также нужны идентификаторы, так они привязаны к их записи в суперклассе.

@Entity
@PrimaryKeyJoinColumn(name = "identifier")
public class Employed extends Person{

 @Id
 private long identifier;

 @Column
 private String actualJob;

 // constructors,getter and setter
}


@Entity
@PrimaryKeyJoinColumn(name = "identifier")
public class Unemployed extends Person{

 @Id
 private long identifier;

 @Column
 private String lastJob;

// constructors,getter and setter
}
0

Вы добавляете ссылку для человека в список предприятия:

entreprise.getPersons().addPerson(person);

При этом вы добавляете только данные человека, а не расширенные данные. Вместо этого вы должны добавить занятый объект.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню