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方法删除产品类型
}
到这里就大功告成!快去尝试一下吧,级联删除解决了,其他要怎么设计数据库,设计外键你都可以放心去做了,不会被这个搞到如此痛苦。
分享到:
相关推荐
在本主题中,我们将深入探讨使用Hibernate注解来实现JPA的一对多、多对多和多对一的关系映射。 1. **一对多关系**: 在现实世界中,一个老师可以教多个学生,或者一个班级可以包含多个学生,这就是典型的一对多...
- `@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`: 用于处理各种关联关系,如一对一、一对多、多对一、多对多。 3. **继承与多态** - `@Inheritance`: 定义继承策略,如SINGLE_TABLE(单表)、JOINED...
2. 一对多(OneToMany):使用`@OneToMany`注解表示一个实体可以对应多个其他实体。 3. 多对一(ManyToOne):使用`@ManyToOne`注解表示多个实体对应一个其他实体。 4. 多对多(ManyToMany):使用`@ManyToMany`注解...
本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...
而Hibernate Annotation是Hibernate的一个重要特性,它通过在Java类和字段上添加注解来简化数据库表和实体类之间的映射配置。这篇博文将带你了解如何使用Hibernate Annotation进行开发。 首先,我们需要理解Java...
在实际的项目开发中,我们经常遇到各种各样的关联关系,比如一对一、一对多、多对一、多对多等。本文将详细讲解“Hibernate Annotation 中的共享主键一对一双向关联”。 首先,我们需要理解什么是共享主键(Shared ...
- `@OneToMany`:一对多关联,一个实体类的实例对应另一个实体类的多个属性。 - `@ManyToMany`:多对多关联,两个实体类之间存在多对多的关系,通常需要一个中间表来维护关系。 5. **懒加载和级联操作注解** - `...
本篇文章将深入探讨如何使用Hibernate Annotation来实现基于外键的单向多对一关联。 在关系型数据库中,多对一关联是一种常见的关系类型,意味着一个实体(如表)可以与另一个实体有多条记录关联,而另一个实体只能...
- **多对一关联 (@ManyToOne)**: 反向的一对多关系,`@ManyToOne`通常与`@JoinColumn`一起使用。 - **多对多关联 (@ManyToMany)**: 两个实体之间有多对多关系,`@ManyToMany`配合`@JoinTable`定义中间表的映射。 ...
- **更好的工具支持**:大多数IDE都对Hibernate Annotation提供了很好的支持,如代码提示、自动完成和验证等。 5. **注意事项** - 虽然注解简化了配置,但并不意味着它可以完全替代XML。在某些复杂场景下,例如...
在Java的持久化框架Hibernate中,一对多(Many-to-One)和多对一(One-to-Many)的关系映射是数据库关系模型中的常见关联类型。本文将深入探讨这两种关联方式在使用Hibernate时的配置,包括基于注解(Annotation)和...
3. @OneToMany:一对多关系 4. @ManyToMany:多对多关系 这些注解用于处理不同类型的关联关系。例如,一个用户可以拥有多个角色,我们可以这样表示: ```java @Entity @Table(name = "users") public class User {...
在处理一对多关系时,Hibernate Annotation提供了便捷的方式来表达实体之间的关联。本文将以一个实例为依托,深入解析如何使用注解来设置一对多关系以及多对一关系的映射。 在Hibernate中,处理一对多关系主要使用`...
4. **关联映射**:在Java对象中,关系(如一对一、一对多、多对多)可以通过`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`注解来定义。例如,一个用户可能有多个订单,可以用以下方式表示: ```java @...
- `@ManyToOne`, `@OneToOne`, `@OneToMany`, `@ManyToMany`: 表示不同类型的关联关系,如一对一、一对多、多对一和多对多。 **3. 注解驱动的配置** 在Hibernate 3.4.0中,可以通过完全依赖注解的方式配置实体类,...
在Java的持久化框架Hibernate中,一对多关系是常见的实体关联类型,表示一个实体可以与多个其他实体相关联。在本教程中,我们将探讨如何使用注解和XML配置实现Hibernate的一对多单向关联。 首先,让我们理解一对多...
- 使用`@OneToMany`注解进行一对多映射配置。 - **多对多映射**: - 使用`@ManyToMany`注解进行多对多映射配置。 - **次级表映射**: - 使用`@SecondaryTables`或`@SecondaryTable`注解来指定多个表之间的关系。...
3.1 OneToMany、ManyToOne:表示一对多和多对一的关系,如用户与订单的关系: ```java // 在User类中 @OneToMany(mappedBy = "user") private List<Order> orders; // 在Order类中 @ManyToOne @JoinColumn(name = ...
然而,随着Java 5的发布,注解成为了一种更直接、更简洁的代码元数据表示方式,Hibernate也随之引入了对注解的支持。 使用Hibernate注解,我们可以直接在实体类上声明如@Entity、@Table、@Id等注解,来标识这个类是...