PaiS PaiS - 1 year ago 88
Java Question

Hibernate JPA one-to-one saving child class entity

I have a one-to-one relationship using

annotated on the parent side. And now I want to save the child entity by itself.

For example, I have
as the child entity, I need to save
(of course after setting the id property of the parent to it). However, when such an arrangement is used, I get an exception listed below...

org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist

Any ideas why hibernate does not allow this? To be more clear, the code I have is below...


public class Employee {
private Long id;
private String name;
private EmployeeInfo info;
private Integer enumId;

public Long getId() {
return id;

public String getName() {
return name;

@OneToOne(cascade = CascadeType.REMOVE)
public EmployeeInfo getInfo() {
return info;


public class EmployeeInfo {
private Long id;
private String email;

public String getEmail() {
return email;

@Column(name = "emp_id", nullable = false)
public Long getId() {
return id;

The way I try to save it is...

Employee emp = new Employee();
EmployeeInfo info = new EmployeeInfo();
info.setEmail("Sh@gmail");; // This uses the JPATemplate provided by Spring JpaDaoSupport


Any pointers would be much appreciated, as to how can I try to save the child entity?

Answer Source

The problem here is that the @Id of EmployeeInfo is declared as being auto-generated and you're thus not supposed to set it manually (Hibernate looks at the Entity passed to persist and assumes it is already in the database because the @Id field is populated).

In other words, remove the @GeneratedValue on EmployeeInfo if you want to set the PK manually.

Note that Hibernate provides support for OneToOne association using a shared primary key in JPA 1.0 through a custom extension. See:

In JPA 2.0, derived identifiers are well supported and you can annotate OneToOne and ManyToOne associations with @Id. See: