일대일 단방향 부모-자녀 ID 캐스케이드 저장
-
18-09-2019 - |
문제
부모 클래스에서 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 제약 조건이 없기 때문에 실패합니다. 세 가지 옵션이 있습니다.
- 아동 실체의 외국 키에서 널 구속 조건을 제거하십시오.
- 양방향 관계를 사용하십시오
- JPA 공급자를 그러한 경우를 지원하는 사람으로 변경하십시오.
당신의 변화 @OneToMany
에게 @OneToMany(cascade=CascadeType.ALL)
최대 절전 모드 확장 대신 JPA를 사용하십시오
내 생각에 @JoinColumn annotation
필요합니다 referencedColumnName
할당된.
@JoinColumn(name = "parent_id", referencedColumnName = "id")