2011-08-20 30 views
1

我對兩個持久實體之間的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 - 但我試過了,它是允許的。

現在,我想知道的是,這是如何表現?並且讓這樣一個(人造的)例子根本就沒有意義(正如你所看到的,這更像是一個理論問題)?

非常感謝您的幫助!

回答

3

cascade = CascadeType.XXX表示:當您對此對象執行XXX操作時,將自動對關聯所引用的對象執行相同的XXX操作。

因此,就你而言,如果你堅持/合併/刪除一篇文章,它也會持續/合併/刪除它的作者。這是非常可疑的。我不認爲你真的想要這樣。

當你刷新作者時,它也會刷新它的文章。

請注意,如果刷新一篇文章,它將刷新其作者(因爲CascadeType.ALL),並且由於關聯表單作者爲文章也具有REFRESH級聯類型,因此它也將刷新作者的所有文章。

+0

非常感謝您的幫助。由於數據庫的限制,如果作者被另一篇文章引用,刪除的文章會引發錯誤,對嗎? (作者不能刪除)。通過雙方的級聯,可以導致無限刷新/刪除/持續循環? –

+0

是的,它會拋出一個錯誤。但是這顯然是級聯ALL沒有意義的一個信號。它不會造成無限循環,因爲Hibernate足夠聰明,可以知道級聯已經應用於實體。 –

+0

好的,非常感謝。我瞭解到,始終使用CascadeType.ALL並不是一個好主意(但是,當我省略DELETE操作時,它們可能是DB中留下的孤兒)。還有一個問題(希望是):這裏的意思是什麼意思?我可以想象PERSIST,DELETE等是什麼,但是在Java中必須做什麼才能產生REFRESH操作? –

相關問題