Я новичок в JPA и изучаю книгу «Сохранение Java с Hibernate 2nd Edition». У меня возникают некоторые трудности в отображении двунаправленного списка @OneToMany (с @OrderColumn) с помощью @JoinTable. У меня не было проблем с @JoinColumn, но, похоже, я что-то не так делаю в случае @JoinTable. Я привел мой пример ниже.
КЛАСС АДРЕСА:
@Entity
@Table(name = "ADDRESS")
public class Address {
@Id
@GeneratedValue(generator = "MY_ID_GENERATOR")
@Column(name="_ADDRESS_ID")
private Long addressId;
@NotNull
@Column(name="_CITY", nullable = false)
protected String city;
//-------------------------------------
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinTable(
name = "ADDRESS_LIST",
joinColumns = {@JoinColumn(name = "_A_ID", unique = true, updatable = false, insertable = false, referencedColumnName = "_ADDRESS_ID")},
inverseJoinColumns = {@JoinColumn(name = "_P_ID", updatable = false, insertable = false, referencedColumnName = "_PERSON_ID")}
)
private Person person;
//-------------------------------------
protected Address() {}
public Address(@NotNull String city) {
super();
this.city = city;
}
public Address(@NotNull String city, Person person) {
super();
this.city = city;
this.person = person;
}
public Long getId() { return addressId; }
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
public Person getPerson() { return person; }
public void setPerson(Person person) { this.person = person; }
}
КЛАСС ЧЕЛОВЕКА:
@Entity
@Table(name = "PERSON")
public class Person {
@Id
@GeneratedValue(generator = "MY_ID_GENERATOR")
@Column(name="_PERSON_ID")
private Long personId;
@NotNull
@Column(name="_NAME", nullable = false, length = 50)
private String name;
//-------------------------------------
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST, orphanRemoval = true)
@JoinTable(
name = "ADDRESS_LIST",
joinColumns = {@JoinColumn(name = "_P_ID", referencedColumnName = "_PERSON_ID")},
inverseJoinColumns = {@JoinColumn(name = "_A_ID", unique = true, referencedColumnName = "_ADDRESS_ID")}
)
@OrderColumn(name = "_ORDER", nullable = false)
private List<Address> addressList = new ArrayList<>();
//-------------------------------------
public Person() {
super();
}
public Person(@NotNull String name) {
super();
this.name = name;
}
public Long getPersonId() { return personId; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public List<Address> getAddressList() { return addressList; }
public void setAddressList(List<Address> addressList) { this.addressList = addressList; }
}
Теперь в основном классе, если я забочусь о обеих сторонах ассоциации, это не работает !!
Person person = new Person("Sourangshu Biswas");
person.getAddressList().add(new Address("Siliguri", person));
person.getAddressList().add(new Address("Kolkata", person));
person.getAddressList().add(new Address("Chennai", person));
Ошибка выдачи !!
Caused by: java.sql.SQLException: Field '_P_ID' doesn't have a default value.
Но если я не передам объект "персона" в констриктор "Address ()", он работает.
Person person = new Person("Sourangshu Biswas");
person.getAddressList().add(new Address("Siliguri"));
person.getAddressList().add(new Address("Kolkata"));
person.getAddressList().add(new Address("Chennai"));
Я проверил базу данных, я также получаю значения в столбце "_ORDER" !! Но вопрос в том, как это работает !! Насколько мне известно, мы должны заботиться о обеих сторонах в двунаправленной ассоциации. Почему он не работает, когда я передаю объект "person" в константу "Address ()" !!!! ?? Объект «человек» еще не сохранился, вот почему? Но то же самое я делал в других типах (SET / BAG) картографирования, тогда это работало.