4

PrimaryKeyJoinColumn我在父端使用带注释的一对一关系。现在我想自己保存子实体。

例如,我有Employee并且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);

任何指针都将不胜感激,至于如何尝试保存子实体?

4

1 回答 1

9

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

换句话说,如果您想手动设置 PK ,请删除@GeneratedValueon 。EmployeeInfo

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

在 JPA 2.0 中,派生标识符得到很好的支持,您OneToOne可以ManyToOne使用@Id. 看:

于 2010-08-17T04:15:53.870 回答