当前位置: 首页 > 面试题库 >

JPA-保持一对多关系

丌官承
2023-03-14
问题内容

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

我有一个从员工到车辆的双向一对多关系。当我第一次将Employee保留在数据库中时(即它没有分配的ID),我也希望保留其关联的Vehicles。

目前,这对我来说很好,除了我保存的Vehicle实体没有自动映射关联的Employee,并且在数据库中Vehicle表中的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);

更简单,更清洁。谢谢大家的帮助!


问题答案:

在保留Employee之前,您必须在Vehicle上设置relatedEmployee。

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

newEmployee.setVehicles(vehicles);

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);


 类似资料:
  • 问题内容: 我试图保持一个非常简单的单向一对多关系,但是EclipseLink(2.3.1)失败。 服务等级(家长): 参数类(子级):( 当然,数据库中有“ service_id”外键字段,由于它是单向关系,因此未在类中表示)。 这是实体持久性的代码: 我得到这个异常: 编辑:由于数据的性质,数据库字段具有(并且应该具有)非空约束。 这是错误还是代码有问题? 问题答案: 尝试删除参数表的serv

  • 问题内容: 我有2个班级:驾驶员和汽车。汽车表在单独的过程中更新。我需要的是在Driver中具有属性,该属性使我可以阅读完整的汽车说明,并仅写入指向现有Car的ID。这是示例: 汽车对象只是典型的JPA对象,没有向后引用驱动程序。 因此,我想通过以下方法实现的目标是:1)我可以使用详细的JSON View阅读完整的汽车描述2)或在简短的JsonView 3中仅阅读汽车的ID 3),最重要的是,在创

  • Car对象只是典型的JPA对象,没有对驱动程序的反向引用。 所以我试图通过这个来实现的是: 我可以使用详细的JSON视图阅读完整的汽车说明 或者我可以只读取汽车的Id,简写为jsonview 最重要的是,在创建新的驱动程序时,我只想传入汽车的JSON ID。这样,我就不需要在persist期间对Car进行不确定的读取,而只需要更新ID。 谢谢你。 更新:忘记了,我在创建驱动程序时通过的汽车的ID是

  • 问题内容: 在使用hibernate和MySQL的spring mvc应用程序中,我收到以下约束冲突异常: 当我尝试保存一个包含type的属性时,会出现问题,这两个属性都在下面定义。 我已经读过很多关于此错误的帖子和博客,但似乎没有一个可以解决我的问题。 如何解决此错误? 这是课程: 这是课程: 这是来自控制器的代码: 这是dao方法: 已执行的SQL语句和hibernate试图通过sql插入的实

  • 和 并将其存储在: 问题是:我真的需要手动保存每页吗?我是否可以只处理java集合,然后只保存主实体,如: 这个例子取自https://attacomsian.com/blog/spring-data-jpa-one-to-many-mapping 我想知道存储关系的正确和最好的方法,这就是为什么我在这里提问,而不仅仅是自己做实验,因为这篇文章似乎误导了很多人

  • 母实体 子实体 代码持久化 请告诉我这些步骤是否正确。我有以下例外。并且无法理解为什么父id在子表中不可用 原因:org.hibernate.exception.ConstraintViolation异常:无法将值NULL插入到列PARAM_REF_ID,表PARAM中;列不允许空值。INSERT失败。