У меня есть 3 объекта, как показано ниже:
@Entity
@Table(name = "person", schema = "test")
public class Person implements Persistable
{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "***")
@SequenceGenerator(name = "***", sequenceName = "***" , schema = "test")
@Column(name = "person_id")
private int personId;
@OneToOne(mappedBy = "personById", cascade = CascadeType.ALL, orphanRemoval = true)
private Address address;
}
@Entity
@Table(***)
class Address
{
@Id
private int personId;
Person personById;
String countryCode;
List<AddressUse> addressById;
@OneToOne
@MapsId
@JoinColumn(name = "person_id", nullable = false)
public Person getPersonById() {
return personById;
}
@OneToMany(mappedBy = "addressById" , cascade = CascadeType.ALL)
public Collection<AddressUse> getAddressById() {
return addressById;
}
}
@Entity
@Table(***)
class AddressUse
{
@Id
private int personId;
@Id
String use;
Date modifyTimestamp;
String updateBy;
Address addressById;
@ManyToOne
@JoinColumn(name = "person_id", nullable = false , insertable = false, updatable = false)
public Address getAddressById() {
return addressById;
}
}
Когда я пытаюсь сохранить Person с автоматически сгенерированным идентификатором, вставка Person и Address происходит правильно, но вставка AddressUse не работает, говоря, что Address не имеет поля personId . Если ключ не сгенерирован автоматически, и я передаю его вручную, все работает хорошо, но с автоматически сгенерированным идентификатором каскад не работает.
Я установил Address в AddressUse и наоборот, я установил Person в Address и Vice наоборот.
Ошибка в ответе:
Ключ (person_id) = (0) отсутствует в таблице «Адрес» Ошибка во время управляемого гриппа sh [org.hibernate.exception. ConstraintViolationException: не удалось выполнить пакет] вставить в db.test.address_use