Hibernate JPA一对一保存子类实体

Pai*_*aiS 4 java orm hibernate jpa one-to-one

PrimaryKeyJoinColumn在父方使用注释有一对一的关系.现在我想自己保存子实体.

例如,我有EmployeeEmpInfo作为子实体,我需要保存EmpInfo(当然在设置父项的id属性后).但是,当使用这样的安排时,我会得到下面列出的例外情况......

org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist
Run Code Online (Sandbox Code Playgroud)

有什么想法为什么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;
    }
  }
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图保存它的方式是......

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);
Run Code Online (Sandbox Code Playgroud)

任何指针都会非常感激,我怎样才能尝试保存子实体?

Pas*_*ent 9

这里的问题是,@IdEmployeeInfo声明为自动生成和你因此不应该手动设置(休眠着眼于实体传递persist,并假设它已经在数据库中,因为该@Id字段被填充).

换句话说,除去@GeneratedValueEmployeeInfo,如果你想手动设置的PK.

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

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