我對兩個持久實體之間的JPA OR映射有一個問題,它們在註釋上具有不同的CascadeType參數。具有不同CascadeType參數的兩個實體的JPA ORM的行爲?
澄清的事情,這裏是一個簡單的例子:
@Entity
public class Article
{
@Id
@GeneratedValue
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
private Author author;
// Getters and Setters follow here
}
_
@Entity
public class Author
{
@Id
@GeneratedValue
private Long id;
@OneToMany(mappedBy = "author", cascade = CascadeType.REFRESH,
orphanRemoval = true)
private List<Article> articles;
// Getters and Setters follow here
}
正如你所看到的, 「作者」 酒店有不同的CascadeType設置 (CascadeType.REFRESH)然後是「articles」屬性(CascadeType.ALL)。起初,我認爲不允許爲同一個屬性映射使用不同的CascadeType - 但我試過了,它是允許的。
現在,我想知道的是,這是如何表現?並且讓這樣一個(人造的)例子根本就沒有意義(正如你所看到的,這更像是一個理論問題)?
非常感謝您的幫助!
非常感謝您的幫助。由於數據庫的限制,如果作者被另一篇文章引用,刪除的文章會引發錯誤,對嗎? (作者不能刪除)。通過雙方的級聯,可以導致無限刷新/刪除/持續循環? –
是的,它會拋出一個錯誤。但是這顯然是級聯ALL沒有意義的一個信號。它不會造成無限循環,因爲Hibernate足夠聰明,可以知道級聯已經應用於實體。 –
好的,非常感謝。我瞭解到,始終使用CascadeType.ALL並不是一個好主意(但是,當我省略DELETE操作時,它們可能是DB中留下的孤兒)。還有一個問題(希望是):這裏的意思是什麼意思?我可以想象PERSIST,DELETE等是什麼,但是在Java中必須做什麼才能產生REFRESH操作? –