`
zhenjie123
  • 浏览: 4790 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

hibernate annotation一对多 级联删除

阅读更多
    hibernate annotation一对多的级联删除,这个问题应该困扰了很多人吧,我也是被困扰了很久,为什么hibernate没有帮我们级联删除呢。
   今天终于解决这个问题,下面给个例子大家,一定是可以级联删除的,之前在网上看了很多例子都无法做到,现在总结一下,给自己和给大家一点帮助。
    annotation比xml的配置方便,却总感觉没有xml的功能强大。
    用annotation的例子如下:
    一个产品类型可以对多个产品,所以产品类型对产品的关系式一对多,产品类型的类如下:

产品分类(一对多中的一方)


import java.util.ArrayList;
import java.util.List;
import org.hibernate.annotations.Cascade;  
//这里一定要用hibernate的annotation,不能用javax.persistence的
import org.hibernate.annotations.CascadeType; 
import javax.persistence.Entity;
import javax.persistence.*;
import javax.persistence.Table;
import cn.com.dee.common.domain.DomainObject;
import cn.com.dee.dot.ProductTypeInfo;
 

/**

 * 产品分类
 */

 

@Entity
@Table(name = "PRODUCTTYPE")
public class ProductType implements DomainObject {
    private static final long serialVersionUID = 3590445506272821257L;
    private String id;
    private String code;
    private String name;
    private String country;
    private List<Product> products = new ArrayList<Product>();  //用于级联删除
    public ProductType(){
    }

    public ProductType(ProductTypeInfo productTypeInfo) {

        this.update(productTypeInfo);

    }
   public void update(ProductTypeInfo productTypeInfo){
     this.code = productTypeInfo.getCode();
     this.name = productTypeInfo.getName();
     this.country = productTypeInfo.getCountry();
    }

    @Id
    @Column(name = "ID", columnDefinition = "INT")
    @GeneratedValue()
    public String getId() {
        return id;
    }

    @Column(name = "CODE", columnDefinition = "VARCHAR(40)")
    public String getCode() {
        return code;
    }

    @Column(name = "NAME", columnDefinition = "VARCHAR(50)")
    public String getName() {
        return name;
    }

    @Column(name = "COUNTRY", columnDefinition = "VARCHAR(50)")
    public String getCountry() {
       return country;
}
 
    /**

     * 用于hibernate级联删除,删除了产品类型,把它下面的所有产品都一起删除

     * @return

     */

   @OneToMany(targetEntity = Product.class,fetch = FetchType.LAZY)
   @JoinColumn(name = "type")
   @Cascade(value={CascadeType.SAVE_UPDATE,CascadeType.DELETE_ORPHAN,CascadeType.ALL})  
    public List<Product> getProducts() {
        return products;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setProducts(List<Product> products) {
        this.products = products;
    }

}

 



产品类(一对多中的多)
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; 
import cn.com.dee.common.domain.DomainObject;
import cn.com.dee.dot.ProductInfo;


 

@Entity
@Table(name = "PRODUCT")
public class Product implements DomainObject {
    private static final long serialVersionUID = -4611900282670726153L;
    private static final Log logger = LogFactory.getLog(Product.class);
    private String id;

     /**

     * 产品全称

     */

    private String fullName;

    /**

     * 产品类型

     */

    private ProductType type;   //关联产品类型那边

    // get方法

    @Id
    @Column(name = "ID", columnDefinition = "INT")
    @GeneratedValue()  //自增
    public String getId() {

        return id;

    }

    //多对一对应product_type数据库里面的主码id

    @ManyToOne
    @JoinColumn(name = "TYPE", referencedColumnName = "ID", unique = false)
    public ProductType getType() {

        return type;

    }

    // set方法

    public void setId(String id) {

        this.id = id;

    }

    public void setType(ProductType type) {

        this.type = type;

    }

}



调用hibernate底层的删除方法如下,只有调用这个方法才可以级联删除,自己写的sql语句是不能级联删除的:

    public void delete(O object) {    //把产品类型的对象传进来

        this.getHibernateTemplate().delete(object);

    }
在service层的删除方法可以这样写:

    /**
     * 删除产品类型,同时也删除该类型下面的产品
     */

    public void delete(ProductTypeInfo typeInfo) {   

     //把ProductTypeInfo转换为ProductType

     ProductType type = new ProductType();
     type.setId(typeInfo.getId());
     type.setCode(typeInfo.getCode());
     type.setCountry(typeInfo.getCountry());
     type.setName(typeInfo.getName());
     productTypeRepository.delete(type);   //调用hibernate底层的delete方法删除产品类型
    }

 


到这里就大功告成!快去尝试一下吧,级联删除解决了,其他要怎么设计数据库,设计外键你都可以放心去做了,不会被这个搞到如此痛苦。
分享到:
评论

相关推荐

    Hibernate+中文文档

    7.4.1. 一对多(one to many) / 多对一(many to one) 7.4.2. 一对一(one to one) 7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many ...

    hibernate3.2中文文档(chm格式)

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    HibernateAPI中文版.chm

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    最全Hibernate 参考文档

    7.4.1. 一对多(one to many) / 多对一(many to one) 7.4.2. 一对一(one to one) 7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to ...

    Hibernate中文详细学习文档

    7.4.1. 一对多(one to many) / 多对一(many to one) 7.4.2. 一对一(one to one) 7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many ...

    Hibernate 中文 html 帮助文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在...

    Hibernate教程

    8.4.1. 一对多(one to many) / 多对一(many to one) 8.4.2. 一对一(one to one) 8.5. 使用连接表的双向关联(Bidirectional associations with join tables) 8.5.1. 一对多(one to many) /多对一( many ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    hibernate 体系结构与配置 参考文档(html)

    一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在...

    Hibernate注释大全收藏

    这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType....

    Hibernate3+中文参考文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在集合中出现的依赖对象 ...

    hibernate3.04中文文档.chm

    8.5.1. 一对多(one to many) /多对一( many to one) 8.5.2. 一对一(one to one) 8.5.3. 多对多(many to many) 9. 组件(Component)映射 9.1. 依赖对象(Dependent objects) 9.2. 在集合中出现的依赖...

    hibernate 框架详解

    一对多(one to many) /多对一( many to one) 8.5.2. 一对一(one to one) 8.5.3. 多对多(many to many) 9. 组件(Component)映射 9.1. 依赖对象(Dependent objects) 9.2. 在集合中出现的依赖对象 ...

    Hibernate参考文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在...

    低清版 大型门户网站是这样炼成的.pdf

    4.3.7 映射一对多双向自身关联关系 244 4.3.8 映射多对多单向关联关系 247 4.3.9 映射多对多双向关联关系 252 4.3.10 映射组成关系 256 4.3.11 映射继承关系 260 4.3.12 hibernate的集合映射 266 4.4 小结 270...

    Spring.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    Spring3.x企业应用开发实战(完整版) part1

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

Global site tag (gtag.js) - Google Analytics