对于具有继承的@OneToMany Hibernate映射,插入失败

时间:2011-05-09 10:26:23

标签: java hibernate inheritance insert one-to-many

我正在使用Java和Hibernate 3.6.4.Final TABLE_B是特定类型的A实体(B)的映射表,它与X实体具有OneToMany关系。
我在DB中插入B实体时遇到问题 从DB读取B实体不是问题,并且相关的X实体也正确加载。

数据库模型:

  • TABLE_A(id,active,info)
  • TABLE_B(a_id,x_id)
  • TABLE_X(id,info)

“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中正确映射我的数据库模型?非常感谢帮助。

1 个答案:

答案 0 :(得分:0)

您不能将TABLE_B作为'entity'表(例如B映射到的表)和'join'表(例如,在B之间保存连接的表X)。

在第一种情况下,TABLE_B每条TABLE_A条记录最多需要一条记录(也就是AB的{​​{1}}条记录;在第二种情况下,TABLE_B需要拥有与X集合中B个元素一样多的记录,这些元素存在明显的矛盾。

因此,您可以执行以下任一操作:

  • 在没有联接表的情况下映射您的Xs集合({1}}在X方面; @ManyToOne在B方面。您的'X_TABLE'必须有@OneToMany mappedBy="X"(或a_id,无论您怎么称呼它)FK给所有者。
  • 使用另一个表格(b_id进行TABLE_B_X - 至 - B映射)