Hibernate级联操作注解

更新时间:2023-07-15 07:02:47 阅读: 评论:0

Hibernate级联操作注解
EJB3 ⽀持的操作类型
[java]
小数点的移动
/**
* Cascade types (can override default EJB3 cascades
*/
public enum CascadeType {
ALL,
PERSIST,
MERGE,
REMOVE,
REFRESH,
DELETE,
SAVE_UPDATE,
REPLICATE,
不一样的美作文/** @deprecated u @OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true) */
@Deprecated
DELETE_ORPHAN,
LOCK,
/** @deprecated u javax.persistence.CascadeType.DETACH */
@Deprecated
EVICT,
DETACH
}
级联更新保存
[java]
@JoinColumn(name = "conf_file_id", referencedColumnName = "conf_file_id",inrtable = true,updatable = true)
@Cascade(value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
级联删除
[java]
@OneToMany(mappedBy = "projectByProPlanId",orphanRemoval=true)
@Cascade(value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
save-update: 级联保存(load以后如果⼦对象发⽣了更新,也会级联更新). 但它不会级联删除
delete: 级联删除, 但不具备级联保存和更新
all-delete-orphan: 在解除⽗⼦关系时,⾃动删除不属于⽗对象的⼦对象, 也⽀持级联删除和级联保存更新.
all: 级联删除, 级联更新,但解除⽗⼦关系时不会⾃动删除⼦对象.
delete-orphan:删除所有和当前对象解除关联关系的对象
注意:以上设在哪⼀段就是指对哪⼀端的操作⽽⾔,⽐如delete,如果设在one的⼀端的<t>属性⾥,就是当one被删除的时候,⾃动删除所有的⼦记录;
如果设在many⼀端的<many-to-one>标签⾥,就是在删除many⼀端的数据时,会试图删除one⼀端的数据,如果仍然有many外键引⽤one,就会报“存在⼦记录”的错误;如果在one的⼀端同时也设置了cascade=“delete”属性,就会发⽣很危险的情况:删除many⼀端的⼀条记录,会试图级联删除对应的one端记录,因为one也设置了级联删除many,所以其他所有与one关联的many都会被删掉。
所以,千万谨慎在many⼀端设置cascade=“delete”属性。
摇滚乐英语故此cascade⼀般⽤在<one-to-one>和<one-to-many>中
以下转载⾃:blog.csdn/sinlff/article/details/7342527
很多⼈对持久层概念搞不清JPA、Hibernate、EJB3.0的关系,这⾥做⼀下简单的说明:JPA是⼀个持久层设计接⼝,EJB3.0和Hibernate是具体的实现
类,EJB3.0和Hibernate的功能近似相等的(Hibernate没有Session Bean,Spring MVC3的SessionAttribute跟Session Bean近似)。
理论是使⽤JPA接⼝可以⽆缝切换持久层实现,但是仅仅是理论上
JPA是在Hibernate成熟并⼤⾏其道的时候才推出的,基本上是借鉴Hibernate的优点,做了⼀个统⼀的标准⽽已,JPA1.0没有⼀对多的级联删除配置,也许JPA2.0⾥才有吧(这⾥没做过调研)
@OneToMany(mappedBy = "commentTeam")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private Set<CommentTeamMember> commentTeamMembers;
这⾥为了说明,只贴出⼀对多的关键代码,其它⽆关的注解已忽略掉,以免造成⼲扰。
这⾥重点说明⼀下四个常⽤的注解配置的区别:
CascadeType.SAVE_UPDATE
CascadeType.ALL
CascadeType.DELETE
CascadeType.DELETE_ORPHAN
之所有之列出这四个,是因为我不想跟书本上把所有的概念都罗列出来。基本上开发时其中的3个都以及⾜够⽤了,下⾯我结合代码演⽰⼀下他们之间的区别,以及使⽤的时候注意的地⽅。
CascadeType.SAVE_UPDATE:Hibernate专有的,JPA并不⽀持,作⽤是级联保存、级联更新(注:JPA很恶⼼,要么你配置
CascadeType.ALL,要么你配CascadeType.SAVE+CasadeType.Merge。⼋卦⼀句:专家虽⽜,多年不写代码,定的标准让编码⿇烦呀!)CascadeType.ALL:级联保存、修改、删除、同步,⼀般很少⽤,看看控制台的⼀长串SQL就知道性能低下,你没改的关联表也给你发update语句,我从来没⽤过这个属性。
CascadeType.DELETE:当调⽤ssion.delete(A)的时候,级联删除关联的对象。(注:先调⽤A.tB(null),再调⽤ssion.delete(A),这样是级联删不掉B的。CascadeType.DELETE_ORPHAN:⼀对多级联删除。
下⾯重点来说说这个CascadeType.DELETE_ORPHAN:梦见毛毛虫
看过API、开发指南,级联删除就⼀个经典的
男图
@OneToMany(mappedBy = "commentTeam")
@Cascade({CascadeType.SAVE_UPDATE,CascadeType.DELETE_ORPHAN})
江西景区
private Set<CommentTeamMember> commentTeamMembers;
mappedBy不可少,映射A->B⼀对多的另⼀边控制反转(谁控谁的问题),新版的Hibernate3.4中配置更简单,变⼀句了,更简洁吧?
@OneToMany(mappedBy = "commentTeam",orphanRemoval=true)
private Set<CommentTeamMember> commentTeamMembers;
CommentTeam (CommentTeam.class,id);
commentTeam.tCommentTeamMember(null);//想级联删除⼦表数据
这样级联删除却没有发⽣,为什么呢?
再来⼀个例⼦
CommentTeam (CommentTeam.class,id);
Set<CommentTeamMember> commentTeamMembers=new HashSet<CommentTeamMember>();
commentTeam.tCommentTeamMember(commentTeamMembers);//想级联删除⼦表数据或增减替换对象
这个例⼦级联删除的效果也没发⽣!即使commentTeamMembers⾥有若⼲个对象。
成功执⾏级联删除的语法:
CommentTeam (CommentTeam.class,id);
不一样的美
圈5
分析⼀下原因:级联删除起作⽤的前提是关联的集合对象不能重新指向新的引⽤,必须在原有的集合⾥操作新增、删除、清空元素,像上⾯的tXXX(null)的⽅法等是起不到级联删除作⽤的,⼤概是Hibernate⾃认⾃⼰原⽣的集合对象吧,⾃⼰New的放进⾏级联删除⽆效!

本文发布于:2023-07-15 07:02:47,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1097493.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:删除   级联   对象   集合   关联   标准   代码   保存
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图