Site Overlay

JPA CascadeType 通俗解释

草,网上的文档基本又是机翻。让我上!


铺垫

设今有两表,一曰 user,一曰 role

User (用户)

id username password
1 小明 ************

Role(角色)

id role
1 工人
2 农民
3 学生

那么为了关联起来,需要一个 user_role 表。

userId username(冗余字段) roleId
1 小明 1
1 小明 2

这表示 userId = 1 的用户(小明),其角色为工人和农民。

正文

CascadeType.REMOVE

现在小明因为背叛了工人阶级,做了工贼,要被删除。如果级联关系是 CascadeType.REMOVE(移除) 那么小明被删除,关联的 roleId (1,2)也会被删除。

CascadeType.MERGE

小明醒了,原来是个梦。小明觉得自己的名字不吉利,因为“明”和“冥”同音,所以要改名叫小狗。如果级联关系是 CascadeType.MERGE(归并),那么除了 user 表中会改名叫小狗,user_role 表也会同样变成小狗。

CascadeType.DETACH

当设置为 CascadeType.DETACH(脱离)之后,小明无论怎么改名,在其他表中都改不了了。覆水难收也。

CascadeType.REFRESH

小狗改了名,打算重新做人,为了更好地建设共产主义,小狗打算把自己的职业改成学生,然后去人民大学深造。获取到自己的个人信息,打算重新填写的时候,由于改名审核不通过,小狗的名字被改回了小明。如果设置为 CascadeType.REFRESH ,那么小狗会先获取到自己改后的名字“小明”,之后才能修改自己的职业。这样避免了并发操作时的覆盖问题。

CascadeType.PERSIST

小明把自己改成学生的途中,发现自己的农民身份被剥夺了,如果开启了 CascadeType.PERSIST 权限,则小明保存之后,会保存现在引用的所有身份,包括被删除的农民身份。

CascadeType.ALL

表示上面都启用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注