2011-12-01 66 views
0

所以我有这个结构。具有多个级别和表的JPA/Hibernate继承。

表1 ID字段1 FIELD2 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中的辅助表没有包含在内。

感谢

+0

是否为T2工作?T3是否保存T1而不是T2? – wrschneider

+0

是的,除了自T2以来不存在,T2和T3上的id字段之间的外键链接失败。所以生成的SQL看起来像这样。 插入T1(...) 插入T3(...) 并且没有生成T2插入。 – BadgerB

回答

0

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

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

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

private String field2 = "test"; 

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

不起作用。

感谢

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; 

祝你好运!

+0

谢谢, 我基本上使用单表,使用如何混合继承文章中的辅助表。我也在相关领域有@Column注解。我实际上是在应用程序的另一部分仅使用一级次表来做到这一点,并且它工作得很好,就是当你有两个次表时,中间表消失。现在我提到它是有道理的,因为SecondaryTable的注释可能被T3类覆盖......问题是我不知道如何解决这个问题。 – BadgerB

+0

哦,原因我这样做是从主T1类有一堆不同类的子类。 实际分类为 控制 - 包含一堆关于控件的数据 面板 - 包含布局样式字段。 页面 - 包含页码。 ...等
我可能只是删除页面表,并将页面信息放入面板表中,这是从数据库中不太清楚,虽然它看起来像一个面板上有一个页码。 – BadgerB

-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; 
} 
+1

欢迎来到SO。请解释您的代码的作用以及它如何解决问题。 http://stackoverflow.com/help/how-to-answer – Aziz

+0

如果想让更多表具有相同的变量(用户,管理员)。您可以创建一个其他抽象类来共享此值。 –