문제

부모 클래스에서 ID를 아동 클래스로 저장하려고 할 때 "오류 - 필드 '부모_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;

감사.

도움이 되었습니까?

해결책

그 매핑이 그대로 작동하기 때문에 다른 곳에서 뭔가 잘못된 것이 있어야합니다. 그들은 더 나아질 수 있지만 일할 것입니다. 구체적으로, 모든 @Column 주석은 중복적이고 불필요하며, 비 순종자가 언급했듯이 JPA의 캐스케이드 속성을 사용해야합니다. @OneToMany 최대 절전 모드 대신 @Cascade. 나는 a 실행 가능한 예 게시 한 내용의 정리 버전으로. Git과 Maven이 있다면 다음과 같이 실행할 수 있습니다.

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'}]}

다른 팁

누구나 같은 문제를 겪을 경우 늦게 추가됩니다.

이 엔티티는 Hibernate 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 남아 있고 관계가 손실됩니다.

그러나 만약 @JoinColumn 정의는 다음과 같이 변경됩니다.

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

, 그런 다음 삽입 문에 포함됩니다 event_id 그와 같은 열이 있어야하며 모든 것이 잘됩니다.

이것은이 특정 버전의 최대 절전 모드에서만 회귀 일 수 있지만 누군가를 도울 수 있습니다.

귀하의 경우, 부모와 함께 자식 객체를 지속시키는 JPA 제공자는 DB에서 최소 3 개의 쿼리를 수행합니다. 먼저 두 사람은 그 자체로 개체를 지속시킵니다. 마지막 하나는 외국 키를 참조하는 부모와 함께 자식 객체를 업데이트합니다. 두 번째 쿼리는 외국 키 열에 null 제약 조건이 없기 때문에 실패합니다. 세 가지 옵션이 있습니다.

  1. 아동 실체의 외국 키에서 널 구속 조건을 제거하십시오.
  2. 양방향 관계를 사용하십시오
  3. JPA 공급자를 그러한 경우를 지원하는 사람으로 변경하십시오.

당신의 변화 @OneToMany 에게 @OneToMany(cascade=CascadeType.ALL) 최대 절전 모드 확장 대신 JPA를 사용하십시오

내 생각에 @JoinColumn annotation 필요합니다 referencedColumnName 할당된.

@JoinColumn(name = "parent_id", referencedColumnName = "id")
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top