JMM*_*JMM 52 java orm jpa one-to-many
也许这是一个愚蠢的问题,但它让我烦恼.
我有一个双向的员工与车辆的一对多关系.当我第一次在数据库中保留一个Employee(即它没有分配的ID)时,我也希望它的相关Vehicle保持不变.
这对我来说很好,除了我保存的Vehicle实体没有自动映射关联的Employee,并且在数据库中,Vehicle表中的employee_id外键列为null.
我的问题是,在员工本身被持久化的同时,是否有可能让车辆的员工坚持下去?我意识到需要首先保存员工,然后保存车辆.JPA可以自动为我做这个吗?或者我必须做以下事情:
Vehicle vehicle1 = new Vehicle();
Set<Vehicle> vehicles = new HashSet<Vehicle>();
vehicles.add(vehicle1);
Employee newEmployee = new Employee("matt");
newEmployee.setVehicles(vehicles);
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
vehicle1.setAssociatedEmployee(savedEmployee);
vehicleDao.persistOrMerge(vehicle1);
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑:根据要求,这是我的映射(没有所有其他方法等)
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="employee_id")
private Long id;
@OneToMany(mappedBy="associatedEmployee", cascade=CascadeType.ALL)
private Set<Vehicle> vehicles;
...
}
@Entity
public class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="vehicle_id")
private Long id;
@ManyToOne
@JoinColumn(name="employee_id")
private Employee associatedEmployee;
...
}
Run Code Online (Sandbox Code Playgroud)
我刚刚意识到我应该在Employee类上定义以下方法:
public void addVehicle(Vehicle vehicle) {
vehicle.setAssociatedEmployee(this);
vehicles.add(vehicle);
}
Run Code Online (Sandbox Code Playgroud)
现在上面的代码如下所示:
Vehicle vehicle1 = new Vehicle();
Employee newEmployee = new Employee("matt");
newEmployee.addVehicle(vehicle1);
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
Run Code Online (Sandbox Code Playgroud)
更简单,更清洁.谢谢大家的帮助!
Bob*_*bby 38
在持久化Employee之前,您必须在Vehicle上设置associatedEmployee.
Employee newEmployee = new Employee("matt");
vehicle1.setAssociatedEmployee(newEmployee);
vehicles.add(vehicle1);
newEmployee.setVehicles(vehicles);
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
Run Code Online (Sandbox Code Playgroud)
use*_*435 17
一种方法是在关系的"一"侧设置级联选项:
class Employee {
//
@OneToMany(cascade = {CascadeType.PERSIST})
private Set<Vehicles> vehicles = new HashSet<Vehicles>();
//
}
Run Code Online (Sandbox Code Playgroud)
通过这个,当你打电话
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
Run Code Online (Sandbox Code Playgroud)
它也会拯救车辆.
归档时间: |
|
查看次数: |
88302 次 |
最近记录: |