具有多个级别和表的JPA / Hibernate继承。

时间:2011-12-01 01:17:40

标签: java hibernate inheritance jpa annotations

所以我有这个结构。

表1 ID FIELD1 域2 discriminatorValue

表2 ID 字段3

表3 ID 字段4

我想使用继承如下。

@DiscriminatorColumn("discriminatorValue")
@Entity
@Inheritance
@Table("Table1")
public class T1  {

@Id
private int id;
...

private String field1;
..
private String field2;
..
}

@SecondaryTable(name = "Table2", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "id",     referencedColumnName = "id")})
@DiscriminatorValue("tbl2")
@Entity
public class T2 extends T1 {

private String field3;
..
}

@SecondaryTable(name = "Table3", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "id",     referencedColumnName = "id")})
@DiscriminatorValue("tbl3")
@Entity
public class T3 extends T2 {

private String field4;
..
}

我发现的是,当我尝试保存T3对象时,来自T2的辅助表不会被包含在内。

由于

3 个答案:

答案 0 :(得分:1)

看起来您正在使用SINGLE_TABLE继承策略,但显式地将子类中的某些属性拆分为单独的表,而不是使用连接子类策略。

这似乎是混合继承策略的标准方法

请参阅: How to mix inheritance strategies with JPA annotations and Hibernate?

Mapping multi-Level inheritance in Hibernate with Annotations

您可能缺少的一件事是指定哪些字段转到哪些列。 @SecondaryTable与继承层次结构无关 - 您可以在单个类中使用它 - 因此您必须明确指定子类中的字段映射到辅助表。

因此在T2你可能需要

@Column(table="tbl2")
private String field3;

并在T3

@Column(table="tbl3")
private String field4;
祝你好运!

答案 1 :(得分:0)

想出来。如果辅助表在任何字段中都没有数据,则不插入该行。

所以在我的情况下,field3没有数据,所以T2没有插入,并且由于T3中的二级表与T2中的行相关联,整个事情就崩溃了。

哦,我发现的另一件事是你不能在中间表的字段上设置默认值来试图强制创建它。 I.E.做任何一件事

private String field2 = "test";

public T2(){
  setField2("test");
}

不起作用。

由于

答案 2 :(得分:-2)

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Project {
  @Id
  private long id;
}


@Entity
@Table(name="LARGEPROJECT")
public class LargeProject extends Project {
  private BigDecimal budget;
}