Pai*_*aiS 4 java orm hibernate jpa one-to-one
我PrimaryKeyJoinColumn在父方使用注释有一对一的关系.现在我想自己保存子实体.
例如,我有Employee和EmpInfo作为子实体,我需要保存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)
任何指针都会非常感激,我怎样才能尝试保存子实体?
这里的问题是,@Id中EmployeeInfo声明为自动生成和你因此不应该手动设置(休眠着眼于实体传递persist,并假设它已经在数据库中,因为该@Id字段被填充).
换句话说,除去@GeneratedValue上EmployeeInfo,如果你想手动设置的PK.
请注意,Hibernate OneToOne通过自定义扩展在JPA 1.0中使用共享主键提供对关联的支持.看到:
在JPA 2.0中,派生标识符得到很好的支持,您可以对其进行注释OneToOne和ManyToOne关联@Id.看到:
| 归档时间: |
|
| 查看次数: |
13910 次 |
| 最近记录: |