Я использую 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 (?, ?);
Попробуйте добавить @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
}
Вы добавляете ссылку для человека в список предприятия:
entreprise.getPersons().addPerson(person);
При этом вы добавляете только данные человека, а не расширенные данные. Вместо этого вы должны добавить занятый объект.