JPA - 坚持一对多的关系

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)

  • 答案不完整.你仍然需要设置级联,因为```默认情况下没有操作级联.`` (3认同)
  • 哦,好的.这样可行.但是我想可能有一种方法可以让我不必明确地将相关员工设置在车辆上? (2认同)

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)

它也会拯救车辆.

  • 嗨,问题是因为mappedBy属性,它将关系的所有者定义为多方.这就是应该在双向多对多关系中的方式,但它可以改变,所以所有者将成为你想要的一方.这个链接,第2.2.5.3.2.1节有一个示例如何做到这一点.http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html最诚挚的问候Denes (9认同)