Hibernate OneToMany с ошибкой ORA-02291
У меня возникает проблема, когда сохраняется сущность с дочерними элементами в отношениях OneToMany. Вот мои две сущности:
@Entity
@Table(name="USER")
public class User implements Serializable {
...
@Id
@Column(name="ID_USER")
private String idUser;
@OneToMany(mappedBy="user", cascade=CascadeType.PERSIST)
private List<Address> address;
public List<Address> getAddress() {
return this.address;
}
public void setAddress(List<Address> address) {
this.address = address;
}
public Address addAddress(Address address) {
getAddress().add(address);
address.setUser(this);
return address;
}
public Address removeAddress(Address address) {
getAddress().remove(address);
address.setUser(null);
return address;
}
...
}
@Entity
@Table(name="ADDRESS")
public class Address implements Serializable {
...
@EmbeddedId
private AddressPK id;
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name="ID_USER", insertable=false, updatable=false, nullable=false)
private User user;
public User getUser() {
return this.user;
}
public void setUser(User user) {
this.user = user;
}
}
@Embeddable
public class AddressPK implements Serializable {
...
@Column(name="ID_USER", insertable=false, updatable=false)
private String idUser;
...
}
А теперь сохраняем операцию, которая генерирует ошибку ORA-02291:
User u = new User();
u.setAddress(new ArrayList<Address>());
u.set...
Address a1 = new Address();
a1.set...
u.addAddress(a1);
Address a2 = new Address();
a2.set...
u.addAddress(a2);
entityManager.persist(u);
Есть идеи, чтобы решить эту проблему?
Спасибо всем!
2 ответа
Со вчерашнего дня я застрял в этом, но теперь я нашел решение своей проблемы. В моем случае ошибка произошла из-за того, что я заставил TRIGGERS настроить MY_SEQUENCE.nextval для PK таблицы соответствующей сущности.
Затем решение изменить TRIGGER для проверки, если:new.PK от объекта является нулевым, чтобы установить его. Наоборот, если он не нулевой, то понимается, что ПОСЛЕДОВАТЕЛЬНОСТЬ была установлена для ПК из JPA. Например:
create or replace TRIGGER "MYSCHEMA"."TGR_MYTABLE_INSERT"
before insert on MYTABLE
for each row
begin
if :new.PK_MYTABLE is null then
select SEQ_MYTABLE.nextval
into :new.PK_MYTABLE
from dual;
end if;
end;
Я думаю, что вам нужно удалить атрибут имени @JoinColumn в таблице адресов
@Entity
@Table(name="ADDRESS")
public class Address implements Serializable {
...
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(insertable=false, updatable=false)
private User user;
public User getUser() {
return this.user;
}
public void setUser(User user) {
this.user = user;
}
}
У вас уже был mappedBy="пользователь" со стороны пользователя.