雇员(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提供的一种特性,允许开发者指定当一个实体被持久化、更新、删除时,其关联的实体应该如何处理。这可以通过`CascadeType`枚举在`@OneToMany`注解中设置。例如,如果我们希望当用户被删除时,所有相关的...
例如,如果我们设置了`CascadeType.ALL`,当保存或删除一个`Student`时,JPA会自动保存或删除所有相关的`Course`。 ```java // 在Student实体的courses属性上设置级联操作 @OneToMany(mappedBy = "student", ...
例如,如果我们设置级联类型为`CascadeType.ALL`,那么删除一个用户时,与之关联的所有订单也会被删除。这通过`@OneToMany`或`@ManyToOne`上的`cascade`属性实现。 4. **加载策略**:Hibernate提供了多种加载策略,...
当我们需要添加或删除关联时,只需操作对应实体的集合属性即可。例如,添加一个学生到课程中: ```java Student student = new Student(); // 设置学生信息... Course course = new Course(); // 设置课程信息... ...
本篇文章将详细讲解如何使用外键在MySQL中实现级联删除和更新。 首先,要使用外键,数据库表必须使用支持外键的存储引擎,如InnoDB。InnoDB引擎提供了事务处理、行级锁定以及外键约束等功能,是实现这些级联操作的...
7. **级联操作(Cascading)**: 通过`@Cascade`注解,可以设置一个操作(如保存、删除)对关联实体的影响。例如,父实体删除时,其子实体也可以被一同删除。 8. **多态性(Polymorphism)**: JPA支持继承和多态性,...
本教程将深入探讨JPA中的一对多双向关联及级联操作,这对于理解和使用JPA进行复杂数据模型管理至关重要。 首先,我们来理解一下一对多关联。在数据库设计中,一对多关联是指一个实体(表)可以与多个其他实体相关联...
4. `REMOVE`:当删除一个实体时,`REMOVE`会级联删除所有关联的实体。这在保持数据一致性时非常有用,避免了因忘记删除关联实体而导致的数据不一致。 5. `REFRESH`:刷新实体时,`REFRESH`会从数据库中获取最新的...
实体管理器负责与数据库交互,执行CRUD(创建、读取、更新、删除)操作。实体管理工厂是单例模式的工厂类,用于创建实体管理器实例。JPQL(Java Persistence Query Language)是JPA提供的面向对象的查询语言,类似于...
2. **实体管理器(EntityManager)**:是JPA的主要工作接口,负责执行CRUD(创建、读取、更新、删除)操作。它提供了保存、查询和删除实体的方法。 3. **实体管理工厂(EntityManagerFactory)**:是创建...
此外,JPA还支持级联操作,例如在一对多或多对多的关系中,可以通过`@OneToMany`和`@ManyToMany`注解配置级联保存或删除。这样,当父对象被保存或删除时,其关联的子对象也会相应地进行操作。 在事务管理方面,JPA...
4. **Repository接口**:Spring Data JPA的核心是Repository接口,通过继承自定义的Repository接口,开发者可以声明CRUD(创建、读取、更新、删除)操作以及自定义查询方法。 5. **Entity实体**:在Spring Data JPA...
5. **级联操作**: 通过`@OneToMany`、`@ManyToOne`和`@ManyToMany`注解,可以定义实体之间的关系,并设置级联操作,如级联保存、删除等。 6. **事务管理**: JPA支持声明式和编程式事务管理,可以方便地与Spring等...
- **实体管理器(EntityManager)**:它是JPA的核心接口,用于执行CRUD(创建、读取、更新、删除)操作。 - **持久化上下文(Persistence Context)**:它是一个缓存区,存储了实体的状态,包括新实体、修改后的实体...
JPA定义了四种实体状态:瞬时态、持久态、托管态和删除态,理解这些状态有助于更好地管理实体的生命周期。 10. **索引与唯一性约束** 可以使用`@Index`和`@UniqueConstraint`注解在数据库表级别添加索引和唯一性...
在JPA中,一对多关系通过@OneToMany和@ManyToOne注解定义,级联操作如CascadeType.PERSIST、CascadeType.REMOVE允许在操作父对象时自动处理子对象的状态。 **11. JPA中的一对多延迟加载与关系维护(一对多关系:二...
4. **懒加载和级联操作**: 支持懒加载关联对象,以及级联操作(如级联保存、级联删除),优化了性能。 ### 源码分析与工具应用 在实际开发中,理解JPA的源码有助于深入理解其工作原理。例如,研究Hibernate作为JPA...
这可以通过级联操作(cascade)在定义关系时指定,确保删除操作会传播到相关的实体。 总的来说,理解JPA中的Entity状态和生命周期对于开发高效且可靠的Java应用程序至关重要。正确管理这些状态有助于确保数据一致性...
此外,OpenJPA2支持懒加载、级联操作、缓存策略等高级特性,这些在实际项目中都是很实用的功能。 通过这个简单的Open JPA2 employee例子,我们可以看到如何在Java应用中使用OpenJPA2来管理和操作数据库。它展示了...