2010-08-16 5 views
4

부모 측에 PrimaryKeyJoinColumn을 사용하여 일대일 관계를가집니다. 이제는 자식 엔티티 자체를 저장하려고합니다.Hibernate JPA 일대일 저장 하위 클래스 엔티티

예를 들어, 하위 엔티티로 EmployeeEmpInfo을 가지고 있습니다. 물론 부모의 id 속성을 설정 한 후에 EmpInfo을 저장해야합니다. 그러나 이러한 배열이 사용되면 아래에 나열된 예외가 발생합니다 ...

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

최대 절전 모드가 허용되지 않는 이유는 무엇입니까? 더 명확하게하기 위해, 나는 다음과 같습니다 가지고있는 코드 ...

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; 
    } 
} 

나는 그것이 저장하려고하는 방법 .. .

임의의 PO 자식 엔티티를 저장하려고하면 어떻게 할 수 있습니까?

답변

9

여기서 문제는 EmployeeInfo@Id가 자동으로 생성 된 것으로 선언하고, 따라서 수동 (엔티티가 persist에 전달하고이 때문에 데이터베이스에 이미 가정에서 최대 절전 모드 보이는을 설정하기로하지 않을 것입니다 @Id 필드가 채워짐).

즉, 수동으로 PK를 설정하려면 EmployeeInfo에서 @GeneratedValue을 제거하십시오.

Hibernate는 사용자 정의 확장을 통해 JPA 1.0에서 공유 기본 키를 사용하여 OneToOne 연관을 지원한다는 점에 유의하십시오. JPA 2.0

가, 파생 식별자가 잘 지원하고 당신은 @IdOneToOneManyToOne 협회 주석을 달 수 있습니다 참조하십시오. 참조 :

+0

큰 덕분에 많은 눈을 뜨게을 위해, (나는이 게시물을보기 전에) 나는 같은 지난 밤을했고, 그것은 문제가 해결. 그러나 이것은 (서비스 사용자가 잘못된 ID를 EmployeeInfo로 설정하여 데이터 손상으로 이어질 수 있기 때문에) 좋은 방법인지 여부를 확신 할 수 없거나 서비스 사용자에게 전체 개체 그래프 (부모 아이뿐만 아니라) 저장 ... – PaiS