@OneToMany插入失败继承映射的Hibernate映射
问题描述:
我正在使用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中正确映射我的数据库模型?非常感谢帮助。
答
你不能TABLE_B
既是“实体”表(例如表,B
映射到)和“加入”表(即拥有如表B
和X
之间的连接)。
在第一种情况下,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
)另一个表
感谢您的帮助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