我正在使用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中正確映射我的數據庫模型?非常感謝幫助。
感謝您的幫助ChssPly76,mych讚賞。 – 2011-05-10 09:19:26
我的解決方案是: *將繼承策略更改爲單個表 *將一個鑑別器列添加到TABLE_A,該列包含我們擁有的對象類型(「C」或「B」,「A」是抽象的,「C」是類似於「B」) *使用TABLE_B作爲B和X關係的映射表。 – 2011-05-10 09:25:41