4

PrimaryKeyJoinColumn親側で注釈付きを使用して1対1の関係があります。そして今、子エンティティを単独で保存したいと思います。

たとえば、子エンティティとして保存する必要がありますEmployee(もちろん、親の id プロパティを設定した後)。ただし、このような配置を使用すると、以下にリストされている例外が発生します...EmpInfoEmpInfo

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

OneToOneHibernate は、カスタム拡張を通じて JPA 1.0 の共有主キーを使用した関連付けのサポートを提供することに注意してください。見る:

JPA 2.0 では、派生識別子が十分にサポートされており、アノテーションOneToOneを付けてManyToOne関連付けることができます@Id。見る:

于 2010-08-17T04:15:53.870 に答える