[英]JPA OneToMany with CascadeType.ALL not persisting children
[英]JPA foreign key constraint with CascadeType.ALL
我有2個實體
那是第一個實體
public class Manager {
// ...
@OneToMany(mappedBy = "manager", cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
private List<ExpertAndRequest> requests;
// ...
}
第二實體。 這是兩個實體的綁定表。
@Entity
@Data
@Table(name = "SOME_TABLE_NAME")
@IdClass(ExpertAndRequestId.class)
public class ExpertAndRequest implements Serializable {
@Id
private Long managerId;
@Id
private Long requestId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "managerId", updatable = false, insertable = false, referencedColumnName = "id")
private Manager manager;
@ManyToOne
@JoinColumn(name = "requestId", updatable = false, insertable = false, referencedColumnName = "id")
private ParticipantRequest request;
}
所以我從表中刪除數據
this.managerRepository.delete(manager);
我得到異常:
org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation
我究竟做錯了什么?
編輯 :
我更新了上面的課程。
這是IdClass
@Data
public class ExpertAndRequestId implements Serializable {
private long managerId;
private long requestId;
public int hashCode() {
return (int)(managerId + requestId);
}
public String toString() {
return String.format("ExpertAndRequestId [expert = \"%s\", request=\"%s\"]", this.managerId, this.requestId);
}
public boolean equals(Object object) {
if (object instanceof ExpertAndRequestId) {
ExpertAndRequestId otherId = (ExpertAndRequestId) object;
return (otherId.requestId == this.requestId) && (otherId.managerId == this.managerId);
}
return false;
}
}
第三實體
public class ParticipantRequest {
// ...
@OneToMany(mappedBy = "request", cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
private List<ExpertAndRequest> experts;
// ...
}
我從https://en.wikibooks.org/wiki/Java_Persistence/ManyToMany獲得的示例
當您在父實體Manager
和ExpertAndRequest
之間建立雙向關系時,您需要的是CascadeType.REMOVE
(或CascadeType.ALL,其中包括REMOVE):您對Hibernate說:“如果父實體被刪除,請刪除子實體”。 在這里進行llo了解如何同時使用CascadeType.REMOVE
和orphanRemoval
嘗試使用cascade = {CascadeType.PERSIST, CascadeType.MERGE}
而不是cascade = CascadeType.ALL
並以該站點為參考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.