我正在使用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