我正在使用Java和Hibernate 3.6.4.Final
TABLE_B是特定类型的A实体(B)的映射表,它与X实体具有OneToMany关系。
我在DB中插入B实体时遇到问题
从DB读取B实体不是问题,并且相关的X实体也正确加载。
数据库模型:
“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 :(得分:0)
您不能将TABLE_B
作为'entity'表(例如B
映射到的表)和'join'表(例如,在B
之间保存连接的表X
)。
在第一种情况下,TABLE_B
每条TABLE_A
条记录最多需要一条记录(也就是A
个B
的{{1}}条记录;在第二种情况下,TABLE_B
需要拥有与X
集合中B
个元素一样多的记录,这些元素存在明显的矛盾。
因此,您可以执行以下任一操作:
Xs
集合({1}}在X方面; @ManyToOne
在B方面。您的'X_TABLE'必须有@OneToMany mappedBy="X"
(或a_id
,无论您怎么称呼它)FK给所有者。b_id
进行TABLE_B_X
- 至 - B
映射)