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

Hibernate JPA一对一保存子类实体

穆锋
2023-03-14
问题内容

PrimaryKeyJoinColumn在父方使用批注具有一对一关系。现在,我想自己保存子实体。

例如,我有EmployeeEmpInfo作为孩子的实体,我需要保存EmpInfo(父的id属性设置为之后的课程)。但是,当使用这种安排时,我在下面列出了一个例外…

org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist

为什么hibernate不允许这样做的任何想法?更清楚地说,我的代码如下…

ParentEntity:

public class Employee {
    private Long id;
    private String name;
    private EmployeeInfo info;
    private Integer enumId;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Long getId() {
        return id;
    }

    @Column(name="EMP_NAME")
    public String getName() {
        return name;
    }

    @PrimaryKeyJoinColumn
    @OneToOne(cascade = CascadeType.REMOVE)
    public EmployeeInfo getInfo() {
        return info;
    }
  }

ChildEntity:

@Table(name="EMP_INFO")
@Entity
public class EmployeeInfo {
    private Long id;
    private String email;

    @Column(name="EMPLOYEE_EMAIL")
    public String getEmail() {
        return email;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "emp_id", nullable = false)
    public Long getId() {
        return id;
    }
}

我尝试保存的方式是…

Employee emp = new Employee();
emp.setEnumId(SimpleEnum.COMPLETE);
emp.setName("Shreyas");
EmployeeInfo info = new EmployeeInfo();
info.setEmail("Sh@gmail");
concreteDAO.save(emp);   // This uses the JPATemplate provided by Spring JpaDaoSupport


info.setId(emp.getId());
concreteDAO.saveEmpInfo(info);

关于如何尝试保存子实体,任何指针将不胜感激。


问题答案:

这里的问题是@IdofEmployeeInfo被声明为自动生成的,因此您不应该手动设置它(Hibernate查看传递给的Entity,persist并假设它已经存在于数据库中,因为该@Id字段已填充)。

换句话说,如果要手动设置PK ,请删除@GeneratedValueon EmployeeInfo

注意,Hibernate OneToOne通过自定义扩展在JPA 1.0中使用共享主键为关联提供支持。看到:

  • JPAhibernate一对一关系

在JPA 2.0中,派生标识符得到了很好的支持,您可以使用进行注释OneToOneManyToOne关联@Id。看到:

  • 通过一对一关系的主键


 类似资料:
  • 背景:对于我的用户,我需要存储一对相同的对象类型(设置),目前我有它像 我正在创建带有设置的KeyValueTypes,并将其添加到列表中(每个用户都有一个列表)。我的设置有一个值字段(它显示了它们是否比其他设置“更重要”),所以我希望基于该字段添加它们,稍后我还需要基于该字段(可能还需要基于名称字段)进行搜索--所以搜索将不得不在列表中查找,然后在KeyValueTypes中查找 问题:什么是最

  • 想要保存一个一对一的主值,如下所示。有一个address类,它包含一个city类一对一。但是city是我的主值,当我保存地址时我不想更新它。只需要从UI的下拉菜单中选择city并将对象设置为原来的地址并保存地址。但是当保存时getting below错误。 org.hibernate.transientPropertyValueException:对象引用了一个未保存的瞬态实例-在刷新之前保存瞬态

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

  • 我已经试着解决这件事很长一段时间了,但我什么也没得到。我一直在试图保存一个实体,该实体拥有对另一个实体的引用。 用户通过填写表单创建一个place实体,然后按save保存该实体。它应该自动在“places”和“place\u url”表中创建新行。下面是我正在加载到应用程序中的SQL文件的链接:https://pastebin.com/x8Gvk7ub 母实体: 子实体: 控制器: Hiberna

  • 在使用hibernate和jpa的spring mvc项目中,我有一个实体和一个实体。每个可以有许多,但每个只能有一个。如何为现有的保存新的? 我读过很多关于这个的帖子。如果我试图保存新的,就会出现无法保存分离实体的错误。但如果我试图保存现有的,则不会保存该角色。我读了这篇帖子,建议将hibernate注释移动到getter,但当我这样做时,我会收到一个引用未知属性的hibernate映射错误。这

  • 我有一个非常简单的spring boot+spring data rest应用程序。我试图使用spring data rest保存具有一对一映射的实体,但看起来只保存了父实体,子实体没有保存。下面是我的代码 启动后,如果我访问http://localhost:8080/api/,我会看到下面的响应 我的代码有什么问题吗?我尝试使用旧的方法,不使用spring data rest,但使用rest控制