【问题标题】:JPA - Persisting a One to Many relationshipJPA - 保持一对多关系
【发布时间】:2010-12-20 05:16:58
【问题描述】:

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

我有员工与车辆的双向一对多关系。当我第一次在数据库中持久化一个员工(即它没有分配的 ID)时,我还希望保留其关联的车辆。

目前这对我来说很好,除了我保存的 Vehicle 实体没有自动映射关联的 Employee,并且在数据库中 Vehicle 表中的 employee_id 外键列为空。

我的问题是,是否可以在保留员工本身的同时保留 Vehicle 的员工?我意识到需要先保存员工,然后再保存车辆。 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);

更简单、更干净。感谢大家的帮助!

【问题讨论】:

    标签: java jpa orm one-to-many


    【解决方案1】:

    一种方法是在关系的“一”侧设置级联选项:

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

    这样,当你打电话时

    Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
    

    它也会拯救车辆。

    【讨论】:

    • 您好,感谢您的回复。我确实在您建议的地方设置了级联集,并且确实保存了车辆。我的问题是当车辆被保存时,我希望他们的外键列employee_id 包含我刚刚保存的员工的id。
    • 外键应该保存在级联中...您可以发送您用于检查的@OneToMany 和@ManyToOne 注释吗?最好的问候丹尼斯
    • 您好,问题是由于 mappedBy 属性,它将关系的所有者定义为多方。这应该是双向的一对多关系的方式,但是可以更改,因此所有者将成为您想要的一方。这个链接,第 2.2.5.3.2.1 节有一个示例如何做到这一点。 docs.jboss.org/hibernate/stable/annotations/reference/en/html/… 最好的问候 Denes
    【解决方案2】:

    在持久化 Employee 之前,您必须在 Vehicle 上设置 associatedEmployee。

    Employee newEmployee = new Employee("matt");
    vehicle1.setAssociatedEmployee(newEmployee);
    vehicles.add(vehicle1);
    
    newEmployee.setVehicles(vehicles);
    
    Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
    

    【讨论】:

    • 哦,好的。这样可行。但我认为可能有一种方法可以让我不必在车辆上明确设置相关员工?
    • 我认为 JPA 不可能做到这一点。如果我没记错的话,我也使用过 Hibernate。
    • 感谢您指出我原始代码中的问题,我已经更新了我将如何解决它。
    • 你做主……很好的解决方案……我有这个问题好几天了……我自己也想过这个解决方案,但对我来说不合逻辑
    • 答案不完整。由于By default no operations are cascaded.,您仍然需要设置级联
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2012-09-27
    • 2011-03-07
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多