Hibernate JPA一对一保存子类实体

我使用在父方注释的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); 

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

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

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

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

  • JPA Hibernate One-to-One关系

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

  • 通过OneToOne关系的主键