`
jacktea
  • 浏览: 6996 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

JPA级连删除

    博客分类:
  • J2EE
 
阅读更多

雇员(Employee)表

部门表(Department)表

 

雇员对部门为1对多的关系。

要求,删除雇员不影响部门,删除部门则同步删除且部门下的所有雇员

import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * 员工实体类
 * @author Administrator
 *
 */

@Entity
@Table(name="employee")
public class Employee{

	@Id
	@Column(name="emp_id")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer empId;   //员工id
	
	@Column(name="emp_name",nullable = false)
	private String empName;  //员工名称
	
	@Column(name="emp_officePhone",nullable = false)
	private String officePhone;  //联系电话
	
	@Column(name="emp_mobilePhone",nullable = false)
	private String mobilePhone;  //办公电话
	
	@Temporal(TemporalType.DATE)
	@Column(name = "emp_entryDate",nullable = false)
	private Date entryDate;  //入职日期
	
	@OneToOne(cascade = CascadeType.ALL)
	@JoinColumn(name = "addr_id")
	private Address homeAddress;  //员工地址
	
  	@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER, optional = false)
  	@JoinColumn(name="dept_id")	
	private Department department;   //员工所在部门

	

	public Integer getEmpId() {
		return empId;
	}

	public void setEmpId(Integer empId) {
		this.empId = empId;
	}

	public String getEmpName() {
		return empName;
	}

	public void setEmpName(String empName) {
		this.empName = empName;
	}

	public String getOfficePhone() {
		return officePhone;
	}

	public void setOfficePhone(String officePhone) {
		this.officePhone = officePhone;
	}

	public String getMobilePhone() {
		return mobilePhone;
	}

	public void setMobilePhone(String mobilePhone) {
		this.mobilePhone = mobilePhone;
	}

	public Date getEntryDate() {
		return entryDate;
	}

	public void setEntryDate(Date entryDate) {
		this.entryDate = entryDate;
	}

	public Address getHomeAddress() {
		return homeAddress;
	}

	public void setHomeAddress(Address homeAddress) {		
		this.homeAddress = homeAddress;
	}

	public Department getDepartment() {
		return department;
	}

	public void setDepartment(Department department) {
		this.department = department;
	}
}

 

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.codehaus.jackson.annotate.JsonIgnore;

/**
 * 部门实体类
 * @author Administrator
 *
 */

@Entity
@Table(name="depart")
public class Department{

	@Id
	@Column(name="dept_id")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	
	@Column(name="dept_name",nullable = false)
	private String deptName;  //部门名称
	
	@OneToOne(cascade = CascadeType.ALL)
	@JoinColumn(name = "loca_id")
	private Location deptLocation;   //部门所在的地址
	
	@JsonIgnore
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "department") 
	private Set<Employee> employees = new HashSet<Employee>();


	public Integer getId() {
		return id;
	}

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

	public String getDeptName() {
		return deptName;
	}

	public void setDeptName(String deptName) {
		this.deptName = deptName;
	}

	public Location getDeptLocation() {
		return deptLocation;
	}

	public void setDeptLocation(Location deptLocation) {
		this.deptLocation = deptLocation;
	}

	public Set<Employee> getEmployees() {
		return employees;
	}

	public void setEmployees(Set<Employee> employees) {
		this.employees = employees;
	}
	
	public void addEmployee(Employee employee){
		employee.setDepartment(this);
		this.employees.add(employee);
	}
	
	public void deleteEmployee(Employee employee){
		this.employees.remove(employee);
		employee.setDepartment(null);
	}
	
	public void clearEmployeeSet(){
		employees.clear();
	}
}

 

@Repository("employeeDAO")
public class EmployeeDAO extends BaseDao<Employee>{

	@Override
	public void delete(Employee obj) {
		Employee ori = findByObject(obj);
		if(null!=ori){
			ori.getDepartment().deleteEmployee(ori);
			getEntityManager().remove(ori);
			return;
		}else{
			throw new DaoException("要删除的对象不存在..");
		}
	}

	
}

 

分享到:
评论

相关推荐

    JPA中的一对多双向关联与级联操作

    级联操作是JPA提供的一种特性,允许开发者指定当一个实体被持久化、更新、删除时,其关联的实体应该如何处理。这可以通过`CascadeType`枚举在`@OneToMany`注解中设置。例如,如果我们希望当用户被删除时,所有相关的...

    10_JPA详解_JPA中的一对多双向关联与级联操作.zip

    例如,如果我们设置了`CascadeType.ALL`,当保存或删除一个`Student`时,JPA会自动保存或删除所有相关的`Course`。 ```java // 在Student实体的courses属性上设置级联操作 @OneToMany(mappedBy = "student", ...

    Hibernate 一对多、多对一、级联、加载、反转

    例如,如果我们设置级联类型为`CascadeType.ALL`,那么删除一个用户时,与之关联的所有订单也会被删除。这通过`@OneToMany`或`@ManyToOne`上的`cascade`属性实现。 4. **加载策略**:Hibernate提供了多种加载策略,...

    JPA中的多对多双向关联实体定义与注解设置

    当我们需要添加或删除关联时,只需操作对应实体的集合属性即可。例如,添加一个学生到课程中: ```java Student student = new Student(); // 设置学生信息... Course course = new Course(); // 设置课程信息... ...

    MySQL使用外键实现级联删除与更新的方法

    本篇文章将详细讲解如何使用外键在MySQL中实现级联删除和更新。 首先,要使用外键,数据库表必须使用支持外键的存储引擎,如InnoDB。InnoDB引擎提供了事务处理、行级锁定以及外键约束等功能,是实现这些级联操作的...

    jpa例子jpajpa

    7. **级联操作(Cascading)**: 通过`@Cascade`注解,可以设置一个操作(如保存、删除)对关联实体的影响。例如,父实体删除时,其子实体也可以被一同删除。 8. **多态性(Polymorphism)**: JPA支持继承和多态性,...

    10_传智播客JPA详解_JPA中的一对多双向关联与级联操作

    本教程将深入探讨JPA中的一对多双向关联及级联操作,这对于理解和使用JPA进行复杂数据模型管理至关重要。 首先,我们来理解一下一对多关联。在数据库设计中,一对多关联是指一个实体(表)可以与多个其他实体相关联...

    实体Bean之间的级联关系

    4. `REMOVE`:当删除一个实体时,`REMOVE`会级联删除所有关联的实体。这在保持数据一致性时非常有用,避免了因忘记删除关联实体而导致的数据不一致。 5. `REFRESH`:刷新实体时,`REFRESH`会从数据库中获取最新的...

    jpa

    实体管理器负责与数据库交互,执行CRUD(创建、读取、更新、删除)操作。实体管理工厂是单例模式的工厂类,用于创建实体管理器实例。JPQL(Java Persistence Query Language)是JPA提供的面向对象的查询语言,类似于...

    jpa经典文档呀

    2. **实体管理器(EntityManager)**:是JPA的主要工作接口,负责执行CRUD(创建、读取、更新、删除)操作。它提供了保存、查询和删除实体的方法。 3. **实体管理工厂(EntityManagerFactory)**:是创建...

    07_传智播客JPA详解_使用JPA加载_更新_删除对象

    此外,JPA还支持级联操作,例如在一对多或多对多的关系中,可以通过`@OneToMany`和`@ManyToMany`注解配置级联保存或删除。这样,当父对象被保存或删除时,其关联的子对象也会相应地进行操作。 在事务管理方面,JPA...

    Spring Data JPA从入门到精通

    4. **Repository接口**:Spring Data JPA的核心是Repository接口,通过继承自定义的Repository接口,开发者可以声明CRUD(创建、读取、更新、删除)操作以及自定义查询方法。 5. **Entity实体**:在Spring Data JPA...

    JPA API 开发手册

    5. **级联操作**: 通过`@OneToMany`、`@ManyToOne`和`@ManyToMany`注解,可以定义实体之间的关系,并设置级联操作,如级联保存、删除等。 6. **事务管理**: JPA支持声明式和编程式事务管理,可以方便地与Spring等...

    JPA

    - **实体管理器(EntityManager)**:它是JPA的核心接口,用于执行CRUD(创建、读取、更新、删除)操作。 - **持久化上下文(Persistence Context)**:它是一个缓存区,存储了实体的状态,包括新实体、修改后的实体...

    JPA基础语法资料--JPA_Basic

    JPA定义了四种实体状态:瞬时态、持久态、托管态和删除态,理解这些状态有助于更好地管理实体的生命周期。 10. **索引与唯一性约束** 可以使用`@Index`和`@UniqueConstraint`注解在数据库表级别添加索引和唯一性...

    传智播客JPA学习笔记.pdf

    在JPA中,一对多关系通过@OneToMany和@ManyToOne注解定义,级联操作如CascadeType.PERSIST、CascadeType.REMOVE允许在操作父对象时自动处理子对象的状态。 **11. JPA中的一对多延迟加载与关系维护(一对多关系:二...

    JPA (Java Persistence API)

    4. **懒加载和级联操作**: 支持懒加载关联对象,以及级联操作(如级联保存、级联删除),优化了性能。 ### 源码分析与工具应用 在实际开发中,理解JPA的源码有助于深入理解其工作原理。例如,研究Hibernate作为JPA...

    jpa学习笔记 介绍了jpa中state的概念和应用

    这可以通过级联操作(cascade)在定义关系时指定,确保删除操作会传播到相关的实体。 总的来说,理解JPA中的Entity状态和生命周期对于开发高效且可靠的Java应用程序至关重要。正确管理这些状态有助于确保数据一致性...

    Open JPA2 employee 简单例子

    此外,OpenJPA2支持懒加载、级联操作、缓存策略等高级特性,这些在实际项目中都是很实用的功能。 通过这个简单的Open JPA2 employee例子,我们可以看到如何在Java应用中使用OpenJPA2来管理和操作数据库。它展示了...

Global site tag (gtag.js) - Google Analytics