我有一个一对一的关系,使用PrimaryKeyJoinColumn
在父端注释。现在我想单独保存子实体。
例如,我有Employee
and EmpInfo
作为子实体,我需要保存EmpInfo
(当然是在将父级的 id 属性设置为它之后)。但是,当使用这样的安排时,我会得到下面列出的异常......
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist
有什么想法为什么休眠不允许这样做吗?更清楚地说,我的代码如下......
父实体:
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;
}
}
子实体:
@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);
任何指示将不胜感激,我该如何尝试保存子实体?
这里的问题是@Id
of EmployeeInfo
被声明为自动生成,因此您不应该手动设置它(Hibernate 会查看传递给的实体persist
并假设它已经在数据库中,因为@Id
字段已填充)。
换句话说,删除@GeneratedValue
on EmployeeInfo
如果你想手动设置PK。
请注意,Hibernate 提供支持OneToOne
通过自定义扩展在 JPA 1.0 中使用共享主键进行关联。看:
- JPA Hibernate 一对一关系 https://stackoverflow.com/questions/787698/jpa-hibernate-one-to-one-relationship
在JPA 2.0中,派生标识符得到了很好的支持,您可以注释OneToOne
and ManyToOne
与 的关联@Id
. See:
- 通过一对一关系的主键 http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_Relationships
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)