我有一个关于两个持久化实体之间的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 - 但我尝试了它,并且允许它。
现在,我想知道的是,这是怎么回事?并且使这样的(人工)例子有任何意义(如你所见,这更像是一个理论问题)?
非常感谢你的帮助!
答案 0 :(得分:3)
cascade = CascadeType.XXX
表示:当您对此对象执行XXX操作时,会自动对该关联引用的对象执行相同的XXX操作。
因此,在您的情况下,如果您持久/合并/删除文章,它也将持久/合并/删除其作者。因此这非常值得怀疑。我不认为你真的想要那个。
当你刷新作者时,它也会刷新文章。
请注意,如果刷新文章,它将刷新其作者(因为CascadeType.ALL),并且由于作者与文章的关联形式也具有REFRESH级联类型,因此它还将刷新作者的所有文章。