具有不同CascadeType参数的两个实体的JPA ORM的行为?

时间:2011-08-20 13:58:40

标签: jpa orm mapping entity

我有一个关于两个持久化实体之间的JPA OR映射的问题,这些实体的注释上有不同的CascadeType参数。

为了澄清事情,这是一个简单的例子:

@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
}

如您所见,“author”属性具有不同的CascadeType集 (CascadeType.REFRESH)然后是“articles”属性(CascadeType.ALL)。起初,我认为不允许使用相同属性映射的不同CascadeType - 但我尝试了它,并且允许它。

现在,我想知道的是,这是怎么回事?并且使这样的(人工)例子有任何意义(如你所见,这更像是一个理论问题)?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:3)

cascade = CascadeType.XXX表示:当您对此对象执行XXX操作时,会自动对该关联引用的对象执行相同的XXX操作。

因此,在您的情况下,如果您持久/合并/删除文章,它也将持久/合并/删除其作者。因此这非常值得怀疑。我不认为你真的想要那个。

当你刷新作者时,它也会刷新文章。

请注意,如果刷新文章,它将刷新其作者(因为CascadeType.ALL),并且由于作者与文章的关联形式也具有REFRESH级联类型,因此它还将刷新作者的所有文章。