刪除父實體時,我也想從數據庫中刪除關聯的子實體。我試圖使用級聯刪除,如下所示,但我必須做一些不正確的事情。刪除父實體時未刪除子實體
當調用父實體對象上的remove時,我收到錯誤消息:「實體仍在數據庫中的其他地方引用」。我可以確認實體在數據庫中其他位置引用的唯一位置在下面的兩個表中(如果我手動刪除數據庫中的子行,父級上的移除調用可以正常工作)。我一直在閱讀關於實體對象,並在過去的9個小時嘗試不同的東西。我究竟做錯了什麼?
這裏是我的父表:
@Entity
@Table(name = "TURTLE_LOOKUP")
public class TurtleLookup implements Serializable
{
@Basic(optional = false)
@Column(name = "TURTLEID")
private int turtleid;
@Basic(optional = false)
@Column(name = "TURTLE")
private String turtle;
@OneToMany(mappedBy = "turtleType", cascade = CascadeType.REMOVE)
List<TurtleReview> turtleReviews;
...
}
這裏是我的子表:
@Entity
@Table(name = "TURTLE_REVIEW")
public class TurtleReview implements Serializable
{
@Column(name = "TURTLE_REVIEW_ID")
private int turtleReviewId;
@Column(name = "TURTLE_YEAR")
private int turtleYear;
@ManyToOne(cascade = CascadeType.REMOVE, optional = false)
@JoinColumn(name = "TURTLE_ID", referencedColumnName = "TURTLEID")
private TurtleLookup turtleType;
@Column(name = "IS_COMPLETE")
private short isComplete;
...
}
編輯/ UPDATE:
如果我改變CascadeType.REMOVE到CascadeType.ALL時,刪除父TurtleLookup實體對象時,TurtleReview實體從數據庫中成功刪除。但是,當調用下面的函數來創建一個新的TurtleReview實體對象時,JPA會嘗試向數據庫中插入一個新的TurtleLookup實體,該實例拋出異常:「Entry已經駐留在數據庫中。以下是創建新的TurtleReview實體時執行的代碼。
public void setDatasetReviewComplete(TurtleLookup turtle, Short year, boolean isComplete)
{
TurtleReview turtleReview = getTurtleReview(turtle, year);
if (turtleReview == null)
{
turtleReview = new TurtleReview();
turtleReview.setTurtleYear(year)
turtleReview.setTurtleType(new a.b.entity.TurtleLookup(turtle.getId(), turtle.getValue()));
}
turtleReview.setIsComplete(isComplete ? (short)1 : 0);
entityManager.persist(turtleReview);
}
當我更改爲CascadeType.ALL時,刪除子對象的作品,但是,創建新的TurtleReview條目時,我收到錯誤消息「條目已駐留在數據庫中」。通過調試JPA/Entity框架創建的SQL語句,我可以看到它試圖在TURTLE_LOOKUP表中插入一個新行,但它不應該是這樣。 – Mitchell
您應該刪除turtlleReview實體上turtletype字段的級聯,以避免在保存turtlereview對象時創建turtlelookup。 – OTM