Hibernate JPA一对一保存子类实体
我使用在父方注释的PrimaryKeyJoinColumn
一对一的关系。 现在我想自己保存子实体。
例如,我有Employee
和EmpInfo
作为子实体,我需要保存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
注释OneToOne
和ManyToOne
关联。 看到:
- 通过OneToOne关系的主键
- 使用jsf,spring,hibernate进行快速全局搜索
- 如何映射Map
- 使用HQL进行Hibernate分页
- Hibernate持久化实体而不提取关联对象。 只是通过id
- 在Hibernate中连接多个数据库
- Hibernateexception帮助:TransientObjectException
- javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:传递给persist的分离实体
- spring – 来自classpath资源的hibernate load * .hbm.xml
- 序列化到json响应时避免hibernate延迟初始化exception的更好方法