`
lgh_ken
  • 浏览: 13842 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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;

 

/**

 * 产品分类

 * @author Dee

 */

 

@Entity

@Table(name = "RuixinPRODUCTTYPE")

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;

 

/**

 * @author Ken

 */

 

@Entity

@Table(name = "RuixinPRODUCT")

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方法删除产品类型

 

 

    }

 

 

 

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

 

 

 

 

 

分享到:
评论
3 楼 wangpenghua 2014-06-09  
太感谢了,解决困扰我一个星期的问题,特意登录上来标识感谢!
2 楼 hyhsoftware 2012-06-03  
刘洋北京 写道
请问下楼主。为什么不能用JPA的annotation而要用hibernate的??

我查了一下jpa的api,貌似没有关于级联删除的参数,不知道这种解释对不对,不过用了hibernate的annotation就可以了
1 楼 刘洋北京 2011-09-15  
请问下楼主。为什么不能用JPA的annotation而要用hibernate的??

相关推荐

    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