当前位置: 首页 > 知识库问答 >
问题:

JPA多对一关系-只需要保存Id

劳鹏云
2023-03-14
@Entity(name = "DRIVER")
public class Driver {
... ID and other properties for Driver goes here .....

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "CAR_ID")
    private Car car;

    @JsonView({Views.Full.class})
    public Car getCar() {
      return car;
    }
    @JsonView({Views.Short.class})
    public long getCarId() {
      return car.getId();
    }
    public void setCarId(long carId) {
      this.car = new Car (carId);
    }

}

Car对象只是典型的JPA对象,没有对驱动程序的反向引用。

所以我试图通过这个来实现的是:

  1. 我可以使用详细的JSON视图阅读完整的汽车说明
  2. 或者我可以只读取汽车的Id,简写为jsonview
  3. 最重要的是,在创建新的驱动程序时,我只想传入汽车的JSON ID。这样,我就不需要在persist期间对Car进行不确定的读取,而只需要更新ID。
object references an unsaved transient instance - save the transient instance before flushing : com.Driver.car -> com.Car

谢谢你。

更新:忘记了,我在创建驱动程序时通过的汽车的ID是DB中现有汽车的有效ID。

共有1个答案

柯昱
2023-03-14

该错误消息意味着在对象图中有一个未显式持久化的瞬态实例。简单回顾一下JPA中对象可以具有的状态:

  • 暂态:尚未存储在数据库中的新对象(因此EntityManager不知道。)没有id集。
  • 托管:entitymanager跟踪的对象。托管对象是您在事务范围内使用的对象,事务提交后,对托管对象所做的所有更改都将自动存储。
  • 分离:先前托管的对象,在事务提交后仍可访问。(事务外部的托管对象。)已设置id。

错误消息告诉您的是,您正在使用的(托管/分离的)驱动对象包含对未知Hibernate的CAR对象的引用(它是瞬态的)。为了使Hibernate理解任何未保存的Car实例也应该被保存,您可以调用EntityManager的persist-method。

@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.PERSIST)
@JoinColumn(name = "CAR_ID")
private Car car;
@ManyToOne(fetch=FetchType.LAZY, cascade={ CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "CAR_ID")
private Car car;
 类似资料:
  • 问题内容: 我有2个班级:驾驶员和汽车。汽车表在单独的过程中更新。我需要的是在Driver中具有属性,该属性使我可以阅读完整的汽车说明,并仅写入指向现有Car的ID。这是示例: 汽车对象只是典型的JPA对象,没有向后引用驱动程序。 因此,我想通过以下方法实现的目标是:1)我可以使用详细的JSON View阅读完整的汽车描述2)或在简短的JsonView 3中仅阅读汽车的ID 3),最重要的是,在创

  • 问题内容: 也许这是一个愚蠢的问题,但这困扰了我。 我有一个从员工到车辆的双向一对多关系。当我第一次将Employee保留在数据库中时(即它没有分配的ID),我也希望保留其关联的Vehicles。 目前,这对我来说很好,除了我保存的Vehicle实体没有自动映射关联的Employee,并且在数据库中Vehicle表中的employee_id外键列为空。 我的问题是,是否可以在雇员本身被保留的同时保

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

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

  • 问题内容: 我已经建立了一个简单的多对多关系帐户:Hibernate角色,但是当我在添加角色后尝试在单元测试中保存帐户时,出现UnsupportedOperationException异常: 这是怎么了 我的实体设置有问题吗?或者这是hibernate或JPA限制,迫使我将m:m关系分解为3:n关系,也为m:n关系表建模(我想避免这种情况,因为它没有任何关系)附加信息)。我已经在原型中为其他1:n

  • 我有一个实体: 要创建上述实体并将其保存到JPA存储库中,我将执行以下操作: 由于DB中的表存储了候选对象的FK,我认为设置一个id就足够了。但JPA希望我设置候选对象。这迫使我查询候选存储库。 是否需要从候选库中查询候选人以保存,或者如果我有可用的候选人id,我不能直接设置它?