也许这是一个愚蠢的问题,但它的烦我。

我有一个双向一个雇员的给车辆一对多的关系。当我坚持一个雇员在数据库中的第一次(即,它没有分配的ID)我也希望其相关联的车辆被保留。

这工作正常,我的那一刻,但我保存的车辆实体没有得到相关联的员工自动映射,并在数据库中的车辆表中的EMPLOYEE_ID外键列是空的。

我的问题是,是否有可能有车的员工持久保存的同时,员工本身正在持续?我意识到,员工将需要首先保存,那么车辆后保存。 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);

谢谢!

编辑:按照要求,这里是我的映射(没有所有的其它方法等)

@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;

    ...
}

我只是意识到我应该对我的Employee类中定义的下述方法:

public void addVehicle(Vehicle vehicle) {
    vehicle.setAssociatedEmployee(this);
    vehicles.add(vehicle);
}

现在上面的代码看起来是这样的:

Vehicle vehicle1 = new Vehicle();

Employee newEmployee = new Employee("matt");
newEmployee.addVehicle(vehicle1);
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

更简单和更清洁。感谢您的帮助大家!

有帮助吗?

解决方案

您有持续雇员之前设置在车辆上的associatedEmployee。

Employee newEmployee = new Employee("matt");
vehicle1.setAssociatedEmployee(newEmployee);
vehicles.add(vehicle1);

newEmployee.setVehicles(vehicles);

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

其他提示

要做到这一点的方法之一是设置你的级联选项关系的“一”方:

class Employee {
   // 

   @OneToMany(cascade = {CascadeType.PERSIST})
   private Set<Vehicles> vehicles = new HashSet<Vehicles>();

   //
}

此,当调用

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

这将节省车辆太

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top