2011-05-09 127 views
1

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

回答

0

你不能TABLE_B既是“实体”表(例如表,B映射到)和“加入”表(即拥有如表BX之间的连接)。

在第一种情况下,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)另一个表
+0

感谢您的帮助ChssPly76,mych赞赏。 – 2011-05-10 09:19:26

+1

我的解决方案是: *将继承策略更改为单个表 *将一个鉴别器列添加到TABLE_A,该列包含我们拥有的对象类型(“C”或“B”,“A”是抽象的,“C”是类似于“B”) *使用TABLE_B作为B和X关系的映射表。 – 2011-05-10 09:25:41