EJB3 支持的操作类型
/**
* Cascade types (can override default EJB3 cascades
*/
public enum CascadeType {
ALL,
PERSIST,
MERGE,
REMOVE,
REFRESH,
DELETE,
SAVE_UPDATE,
REPLICATE,
/** @deprecated use @OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true) */
@Deprecated
DELETE_ORPHAN,
LOCK,
/** @deprecated use javax.persistence.CascadeType.DETACH */
@Deprecated
EVICT,
DETACH
}
级联更新保存,在Many一端加入如下注解。 如果父类(insert)是自动增长的,请设置 @GeneratedValue
@JoinColumn(name = "conf_file_id", referencedColumnName = "conf_file_id",insertable = true,updatable = true)
@Cascade(value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@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的一端的
如果设在many一端的
所以,千万谨慎在many一端设置cascade=“delete”属性。
故此cascade一般用在
以下转载自:http://blog.csdn.net/sinlff/article/details/7342527
很多人对持久层概念搞不清JPA、Hibernate、EJB3.0的关系,这里做一下简单的说明:JPA是一个持久层设计接口,EJB3.0和Hibernate是具体的实现类,EJB3.0和Hibernate的功能近似相等的(Hibernate没有Session Bean,Spring MVC3的SessionAttribute跟Session Bean近似)。
理论是使用JPA接口可以无缝切换持久层实现,但是仅仅是理论上!!!private Set
CommentTeam commentTeam=this.getHibernateTemplate.get(CommentTeam.class,id);
commentTeam.setCommentTeamMember(null);//想级联删除子表数据
this.getHibernateTemplate.saveOrUpdate(commentTeam);
这样级联删除却没有发生,为什么呢?
再来一个例子
CommentTeam commentTeam=this.getHibernateTemplate.get(CommentTeam.class,id);
Set
commentTeam.setCommentTeamMember(commentTeamMembers);//想级联删除子表数据或增减替换对象
this.getHibernateTemplate.saveOrUpdate(commentTeam);
这个例子级联删除的效果也没发生!即使commentTeamMembers里有若干个对象。
成功执行级联删除的语法:
CommentTeam commentTeam=this.getHibernateTemplate.get(CommentTeam.class,id);
commentTeam.getCommentTeamMember().clear();//注意这里引用的集合还是原来的集合,这里没有重新new过
commentTeam.getCommentTeamMember().add(new CommentTeamMember());//如果想替换为新的集合可以用addAll方法
this.getHibernateTemplate.saveOrUpdate(commentTeam);
分析一下原因:级联删除起作用的前提是关联的集合对象不能重新指向新的引用,必须在原有的集合里操作新增、删除、清空元素,像上面的setXXX(null)的方法等是起不到级联删除作用的,大概是Hibernate自认自己原生的集合对象吧,自己New的放进行级联删除无效!