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

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 annotation JPA 一对多,多对多

    在本主题中,我们将深入探讨使用Hibernate注解来实现JPA的一对多、多对多和多对一的关系映射。 1. **一对多关系**: 在现实世界中,一个老师可以教多个学生,或者一个班级可以包含多个学生,这就是典型的一对多...

    hibernate annotation 中文文档

    - `@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`: 用于处理各种关联关系,如一对一、一对多、多对一、多对多。 3. **继承与多态** - `@Inheritance`: 定义继承策略,如SINGLE_TABLE(单表)、JOINED...

    最全的Hibernate Annotation API文档

    2. 一对多(OneToMany):使用`@OneToMany`注解表示一个实体可以对应多个其他实体。 3. 多对一(ManyToOne):使用`@ManyToOne`注解表示多个实体对应一个其他实体。 4. 多对多(ManyToMany):使用`@ManyToMany`注解...

    Hibernate Annotation 基于外键的一对多双向关联

    本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...

    Hibernate Annotation入门

    而Hibernate Annotation是Hibernate的一个重要特性,它通过在Java类和字段上添加注解来简化数据库表和实体类之间的映射配置。这篇博文将带你了解如何使用Hibernate Annotation进行开发。 首先,我们需要理解Java...

    Hibernate Annotation 共享主键一对一双向关联

    在实际的项目开发中,我们经常遇到各种各样的关联关系,比如一对一、一对多、多对一、多对多等。本文将详细讲解“Hibernate Annotation 中的共享主键一对一双向关联”。 首先,我们需要理解什么是共享主键(Shared ...

    hibernate-Annotation.jar

    - `@OneToMany`:一对多关联,一个实体类的实例对应另一个实体类的多个属性。 - `@ManyToMany`:多对多关联,两个实体类之间存在多对多的关系,通常需要一个中间表来维护关系。 5. **懒加载和级联操作注解** - `...

    Hibernate Annotation 基于外键的单向多对一关联

    本篇文章将深入探讨如何使用Hibernate Annotation来实现基于外键的单向多对一关联。 在关系型数据库中,多对一关联是一种常见的关系类型,意味着一个实体(如表)可以与另一个实体有多条记录关联,而另一个实体只能...

    Hibernate Annotation 学习笔记

    - **多对一关联 (@ManyToOne)**: 反向的一对多关系,`@ManyToOne`通常与`@JoinColumn`一起使用。 - **多对多关联 (@ManyToMany)**: 两个实体之间有多对多关系,`@ManyToMany`配合`@JoinTable`定义中间表的映射。 ...

    hibernate annotation 3.40

    - **更好的工具支持**:大多数IDE都对Hibernate Annotation提供了很好的支持,如代码提示、自动完成和验证等。 5. **注意事项** - 虽然注解简化了配置,但并不意味着它可以完全替代XML。在某些复杂场景下,例如...

    Hibernate一对多(多对一)双向关联(annotation/xml)

    在Java的持久化框架Hibernate中,一对多(Many-to-One)和多对一(One-to-Many)的关系映射是数据库关系模型中的常见关联类型。本文将深入探讨这两种关联方式在使用Hibernate时的配置,包括基于注解(Annotation)和...

    hibernate-annotation-3.4.0.GA

    3. @OneToMany:一对多关系 4. @ManyToMany:多对多关系 这些注解用于处理不同类型的关联关系。例如,一个用户可以拥有多个角色,我们可以这样表示: ```java @Entity @Table(name = "users") public class User {...

    hibernate anotation 处理一对多关系

    在处理一对多关系时,Hibernate Annotation提供了便捷的方式来表达实体之间的关联。本文将以一个实例为依托,深入解析如何使用注解来设置一对多关系以及多对一关系的映射。 在Hibernate中,处理一对多关系主要使用`...

    Hibernate Annotation应用

    4. **关联映射**:在Java对象中,关系(如一对一、一对多、多对多)可以通过`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`注解来定义。例如,一个用户可能有多个订单,可以用以下方式表示: ```java @...

    Hibernate-Annotation-3.4.0帮助文档

    - `@ManyToOne`, `@OneToOne`, `@OneToMany`, `@ManyToMany`: 表示不同类型的关联关系,如一对一、一对多、多对一和多对多。 **3. 注解驱动的配置** 在Hibernate 3.4.0中,可以通过完全依赖注解的方式配置实体类,...

    Hibernate一对多单向关联(annotation/xml)

    在Java的持久化框架Hibernate中,一对多关系是常见的实体关联类型,表示一个实体可以与多个其他实体相关联。在本教程中,我们将探讨如何使用注解和XML配置实现Hibernate的一对多单向关联。 首先,让我们理解一对多...

    Hibernate_Annotation参考文档

    - 使用`@OneToMany`注解进行一对多映射配置。 - **多对多映射**: - 使用`@ManyToMany`注解进行多对多映射配置。 - **次级表映射**: - 使用`@SecondaryTables`或`@SecondaryTable`注解来指定多个表之间的关系。...

    hibernate_annotation

    3.1 OneToMany、ManyToOne:表示一对多和多对一的关系,如用户与订单的关系: ```java // 在User类中 @OneToMany(mappedBy = "user") private List&lt;Order&gt; orders; // 在Order类中 @ManyToOne @JoinColumn(name = ...

    Hibernate-Annotation初步.rar

    然而,随着Java 5的发布,注解成为了一种更直接、更简洁的代码元数据表示方式,Hibernate也随之引入了对注解的支持。 使用Hibernate注解,我们可以直接在实体类上声明如@Entity、@Table、@Id等注解,来标识这个类是...

Global site tag (gtag.js) - Google Analytics