2009-11-06 57 views
3

當試圖從我的父類保存一個ID到一個子類時,我不斷收到錯誤 「錯誤 - 字段'parent_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; 

感謝。

+1

你是什麼意思「當試圖從我的父類保存一個ID到一個子類」。你能詳細說明嗎? – 2009-11-06 22:56:05

回答

6

你必須在其他地方有什麼問題,因爲這些映射將按照它們的方式工作。他們可能會更好,但他們會工作。具體而言,所有@Column註釋都是多餘且不必要的,並且作爲非限定註釋,您應該使用JPA的@OneToMany而不是Hibernate的@Cascade的級聯屬性。我創建了一個runnable example,其中包含您發佈內容的清理版本。如果你有Git和行家,你可以運行它:

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,而不是Hibernate的擴展

+2

儘管這是一個有效的建議,但它並不能完全回答OP的問題。 – ChssPly76 2009-11-07 19:51:09

+0

絕對正確ChssPly76我認爲他在這裏使用的擴展是沒有根據的,因爲看到'parent_id'沒有正確傳播。除了我提出的改變之外,他的註釋看起來都是正確的。由於缺乏來自OP的信息,您認爲現在發生了什麼? – 2009-11-08 02:21:49

+0

沒有更多的信息是不可能的。 – ChssPly76 2009-11-09 18:44:17

0

我的猜測是,@JoinColumn annotation需要分配一個referencedColumnName

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

在創建引用主鍵的外鍵的典型情況下,不需要referencedColumnName。從文檔:「默認(僅在使用單個連接列時適用):與被引用表的主鍵列名稱相同。」 – 2011-08-14 03:35:27

11

逾期增加的情況下,沒有人跑進了同樣的問題。

這裏這個實體,使用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<?>>(); 

} 

也不對insert語句設置event_id列在事實之後它也不更新插入的實體 - event_id保持爲空,並且關係丟失。

然而,如果該@JoinColumn定義改變這樣的:

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

,然後insert語句包括event_id柱像它應該,一切都很好。

這可能只是這個特定版本的Hibernate的迴歸,但也許它有助於某人。

+2

我真的在摸索着解決這個問題,並將@JoinColumn(name =「event_id」)'改爲'@JoinColumn(name =「event_id」,nullable = false)'解決了這個問題。 – 2014-10-25 09:09:46

4

在你的情況JPA提供者堅持子對象與其父對子數據庫執行至少三個查詢。前兩個堅持自己的對象。最後一個 用外鍵引用父對象更新子對象。第二個查詢失敗,因爲您在外鍵列上有NOT NULL約束。你有三個選擇:

  1. 刪除NOT NULL約束在子實體
  2. 使用雙向關係
  3. 更改JPA提供一個支持此類案件外鍵。
+0

選項1使用EclipseLink 2.5.1爲我解決了這個問題謝謝! – 2014-07-03 14:00:01