2009-11-06 4 views
3

부모 클래스의 ID를 자식 클래스로 저장하려고하면 계속 오류가 발생합니다. "오류 - 'parent_id'필드에 기본값이 없습니다. "1 대 다수 단방향 부모 - 자식 ID 계단식 저장

모든 유형의 매핑을 시도했습니다. 주석을 사용하고 있습니다. 이에

어떤 도움을 주시면 감사하겠습니다

부모 :

 @Id 
     @Column(name="id") 
     @GeneratedValue(strategy=GenerationType.AUTO) 
     private long id; 
     @Column(name="description") 
     private String description; 
     @OneToMany 
     @Cascade(value= {org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE}) 
     @JoinColumn(name="parent_id") 
     private List<Child> children; 

아이 :

@Id 
    @Column(name="id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private long id; 
    @Column(name="description") 
    private String description; 

감사합니다.

+1

"부모 클래스에서 자식 클래스로 ID를 저장하려고 할 때"라는 의미는 무엇입니까? 당신은 정교 할 수 있습니까? –

답변

6

이러한 매핑이 정상적으로 작동하기 때문에 다른 어떤 것이 있어야합니다. 그들은 더 좋을 수도 있지만 일할 것입니다. 특히, 모든 @Column 주석은 중복되고 불필요하며, 별 도의 사항이 없으므로 최대 절전 모드 @Cascade 대신 JPA의 @OneToMany의 캐스케이드 속성을 사용해야합니다. 내가 게시 한 내용의 정리 된 버전으로 runnable example을 생성했습니다. 당신이 자식과 받는다는있는 경우에, 당신은 그것을 실행할 수 있습니다

git clone git://github.com/zzantozz/testbed tmp 
cd tmp 
mvn -q compile exec:java \ 
    -Dexec.mainClass=rds.hibernate.UnidirectionalManyToOneJoinColumn \ 
    -pl hibernate-unidirectional-one-to-many-with-join-column 

그것은, 두 아이를 가진 부모를 만들고이를 저장 한 다음 전원을로드하고 그래프를 출력합니다. 출력은 다음과 같습니다.

Creating parent with two children 
Loading saved parent 
Parent{description='parent', children=[Child{description='child 2'}, Child{description='child 1'}]} 
1

변경하여 @OneToMany@OneToMany(cascade=CascadeType.ALL) 사용 JPA보다는

+2

확실히 유효한 제안이지만 OP의 질문에 정확하게 답하지는 못합니다. – ChssPly76

+0

절대적으로 맞습니다. ChssPly76 여기에서 확장 기능을 사용하는 것이 'parent_id'가 올바르게 전파되지 않는다고 생각하지 않았다고 가정했습니다. 그의 주석은 제가 제안한 변화들 옆에서 모두 옳게 보입니다. 당신은 OP에서 정보의 부족 주어진 일이라고 생각합니까? –

+0

더 이상의 정보 없이는 말할 수 없습니다. – ChssPly76

0

내 생각은 @JoinColumn annotation가 할당 된 referencedColumnName을 필요로한다는 것입니다 최대 절전 모드 확장합니다.

@JoinColumn(name = "parent_id", referencedColumnName = "id") 
+0

referencedColumnName은 기본 키를 참조하는 외래 키를 만드는 전형적인 경우에는 필요하지 않습니다. 문서에서 : "기본값 (단일 조인 열이 사용되는 경우에만 적용됨) : 참조 된 테이블의 기본 키 열과 동일한 이름입니다." –

11

누구도 동일한 문제가있는 경우를 대비하여 늦게 추가되었습니다.

최대 절전 모드 4.1.8, 것이다 캐스케이드 FieldChange 엔티티를 사용하여 지속, 그러나 (가) 열 가입 기입하지 때 여기에이 개체는

:

@Entity 
public class Event { 

    //ID and other fields here 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "event_id") 
    private List<FieldChange<?>> fields = new ArrayList<FieldChange<?>>(); 

} 

어느 쪽을 삽입 문은 event_id 열을 설정 않습니다 사실 이후에도 삽입 된 엔티티를 업데이트하지 않습니다. event_id이 null로 유지되고 관계가 손실됩니다.

경우, 그러나, @JoinColumn 정의는 다음과 같이 변경됩니다 :

@JoinColumn(name = "event_id", nullable = false) 

은 다음 삽입 문은해야 같은 event_id 열을 포함, 모두 잘 있습니다.

이것은 Hibernate의이 특정 버전에서의 회귀 일 수 있지만 어쩌면 누군가에게 도움이 될 수 있습니다.

+2

나는이 문제에 대해 정말 고심하고'@JoinColumn (name = "event_id")'를'@JoinColumn (name = "event_id", nullable = false)로 변경하면 문제가 해결되었다. –

4

경우에 따라 상위 개체와 함께 하위 개체를 유지하는 JPA 공급자는 db에 대해 최소 3 개의 쿼리를 수행합니다. 처음 두 가지는 객체를 자체적으로 유지합니다. 마지막 하나 부모를 참조하는 외래 키가있는 하위 개체를 업데이트합니다.외래 키 열에 NOT NULL 제약 조건이 있으므로 두 번째 쿼리가 실패합니다.

  1. 제거 NULL 제약 조건 아이 엔티티
  2. 를 사용하여 양방향 관계 이러한 경우를 지원 하나
  3. 변경 JPA 공급자의 외래 키에 : 당신은 세 가지 옵션이 있습니다.
+0

옵션 1이 EclipseLink 2.5.1을 사용하여이 문제를 해결했습니다. 감사합니다! –

관련 문제