一对一单向映射:持久化Employee时自动持久化EmployeeDetail
JPA一对一单向映射:从父实体触发自动持久化子实体
完全支持从父侧(Employee)触发自动持久化子实体(EmployeeDetail),只需在父实体的关联字段上配置正确的级联规则和映射关系即可,以下是具体实现方案:
1. 配置父实体Employee
在Employee中添加EmployeeDetail的引用,并通过@OneToOne注解指定级联策略和外键映射:
@Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String department; // 级联持久化:保存Employee时自动保存关联的EmployeeDetail // @JoinColumn指定子表EmployeeDetail的外键为employee_id,关联当前实体的id @OneToOne(cascade = CascadeType.PERSIST) @JoinColumn(name = "employee_id", referencedColumnName = "id", unique = true) private EmployeeDetail detail; // 构造器、getter、setter省略 }
2. 配置子实体EmployeeDetail
单向映射下,子实体无需持有父实体的引用,只需定义自身的字段即可:
@Entity public class EmployeeDetail { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String address; private String phone; // 无关联Employee的字段,保持单向关联 // 构造器、getter、setter省略 }
3. 持久化操作示例
只需创建并关联两个实体,然后调用父实体的persist方法,JPA会自动级联保存子实体:
// 创建子实体 EmployeeDetail empDetail = new EmployeeDetail(); empDetail.setAddress("北京市朝阳区XX路"); empDetail.setPhone("138XXXX1234"); // 创建父实体并关联子实体 Employee employee = new Employee(); employee.setName("张三"); employee.setDepartment("后端开发部"); employee.setDetail(empDetail); // 仅持久化父实体,自动触发子实体的持久化 entityManager.persist(employee);
关键说明
- 级联策略选择:
CascadeType.PERSIST仅触发持久化操作,如果需要级联更新、删除等操作,可替换为CascadeType.ALL,根据业务需求调整。 - 外键约束:
@JoinColumn中的unique = true保证了Employee和EmployeeDetail的一对一关联关系,避免一个Employee对应多个EmployeeDetail。 - 若未给Employee设置EmployeeDetail实例,JPA不会触发任何级联操作,仅保存Employee自身。
内容的提问来源于stack exchange,提问作者bharathi
相关产品推荐
相关产品推荐

