2011-05-09 113 views
1

我正在使用Java和Hibernate 3.6.4.Final。
TABLE_B是一個特定類型的A實體(B)的映射表,它與X個實體具有OneToMany關係。
我在數據庫中插入B實體時遇到問題。
從DB中讀取B實體不是問題,並且相關的X實體也正確加載。@OneToMany插入失敗繼承映射的Hibernate映射

DB模式:

  • TABLE_A(ID,活動信息)
  • 表-B(A_ID,X_ID)
  • TABLE_X(ID,資訊)

的 「A」 實體可能與X個實體有零或多個關係。
與X有一個或多個關係的「A」實體被稱爲「B」實體,並且在代碼中有自己的行爲。

(類和表的名稱已更改爲簡單起見)

@Entity 
@Table(name = "TABLE_A") 
@Inheritance(strategy = InheritanceType.JOINED) 
public abstract class A { 
    ... 
} 

@Entity 
@Table(name="TABLE_B") 
@PrimaryKeyJoinColumn(name="A_ID", referencedColumnName = "ID") 
public class B extends A implements Serializable { 

    @OneToMany(cascade={CascadeType.ALL}) 
    @JoinTable(
     name="TABLE_B", 
     joinColumns = @JoinColumn(name="A_ID"), 
     inverseJoinColumns = @JoinColumn(name="X_ID", insertable = true, nullable = false) 
    ) 
    private List<X> Xs; 
    ... 
} 

日誌:

SQLStatementLogger - insert into TABLE_A (active, info) values (?, ?) 
SQLStatementLogger - insert into TABLE_B (A_ID) values (?) 
JDBCExceptionReporter - could not insert: [com.test.B] [insert into TABLE_B (A_ID) values (?)] 
java.sql.SQLException: Field 'X_ID' doesn't have a default value 

如果問題是由指定實體表引起我會明白「TABLE_B」並使用OneToMany連接表中的相同內容,但這是我的數據庫模型的外觀。
對我來說,似乎Hibernate首先試圖插入繼承,如果這將工作,下一個插入將是B和X之間的映射。問題是,對於我來說,繼承和映射表是相同的。

如何在Hibernate中正確映射我的數據庫模型?非常感謝幫助。

回答

0

你不能TABLE_B既是「實體」表(例如表,B映射到)和「加入」表(即擁有如表BX之間的連接)。

在第一種情況下,TABLE_B需要具有至多一個記錄用於每個TABLE_A記錄(即,對於那些A s表示也B S);在第二種情況下,TABLE_B需要具有與B的集合中的X元素一樣多的記錄,這存在明顯的矛盾。

你可以做什麼,因此,這是下面的任一:

  • 地圖您的收藏Xs無連接表(@ManyToOne在X側; @OneToMany mappedBy="X"在B側)。您的'X_TABLE'必須有一個a_id(或b_id,無論您稱之爲)FK給所有者。
  • 使用(B至 - X映射TABLE_B_X)另一個表
+0

感謝您的幫助ChssPly76,mych讚賞。 – 2011-05-10 09:19:26

+1

我的解決方案是: *將繼承策略更改爲單個表 *將一個鑑別器列添加到TABLE_A,該列包含我們擁有的對象類型(「C」或「B」,「A」是抽象的,「C」是類似於「B」) *使用TABLE_B作爲B和X關係的映射表。 – 2011-05-10 09:25:41