Jpa hibernate和Table_Per_class继承

时间:2015-08-03 16:29:02

标签: java hibernate jpa inheritance

我有一个超级实体

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "super_class")
public abstract class SuperClass implements Serializable {
    @Transient
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private long id;

    public abstract void initDefaultValues();

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

}

和一些扩展SuperClass的子类。

@Entity
@Table(name = "Subclass1")
public class Subclass1 extends SuperClass{

    private static final Logger log = LogManager
            .getLogger(Subclass1.class);
    @Transient
    private static final long serialVersionUID = 1L;

    // testcase configuration tab
    private String configurationTabTestServer;


    private String umtsRelease;


}

其他类看起来一样。

我曾经为继承类型提供了SINGLE_TABLE,但我们希望每个具体的类都有自己的表。由于TABLE_PER_CLASS,我必须使用GenerationType.TABLE。

我还有一个具有超类

外键的实体类
@Entity
@Table(name="myother_entity")
class Entity1{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @OneToOne(cascade = CascadeType.ALL)
    private SuperClass superclass;
    //more fields
}

我使用了一个抽象类,因为我有一个Entity1类可以有不同类型的Superclass。我们不想为每个子类创建不同的Entity1和Entity2以及Entity3等类。所以我们创建了一个Entity1类,它可以有一个SuperClass类型的字段,可以指向任何子类。

在我的程序中,我创建了许多Entity1内容,其中一些具有不同类型的超类作为字段值。每个都可以是子类1或子类2等类型。首先,我们曾经为所有子类都有一个单独的表。一切都很好。但在我们决定拆分我们的桌子后,这就是它发生的事情。当我编辑任何Entity1实例时,已经设置了SuperClass字段(使用其中一个子类),并保存它(合并它)然后它创建了一个与我的Entity1实例关联的子类的新实例,然后将其保存到数据库。所以我现在在子类的表上有两条记录。当我们使用SINGLE_TABLE继承类型时,这并没有发生。这是JPA和hibernate的正常行为吗?

1 个答案:

答案 0 :(得分:0)

请首先考虑一下:DiscriminatorColumn和DiscriminatorValue注释特定于单表方法。所以它们不能用于每表映射。

现在,我们来讨论这个问题:

在每个类的表映射中,将有两个具有相同ID的记录:一个在父表中,另一个在子表中。

据我了解,在您的情况下,子表中正在写两条记录,对吧?如果是这样,问题必须是从数据库加载Entity1数据。属性“超类”必须设置其ID。您可以使用预先加载或延迟加载。在保存之前检查该属性是否已正确加载(在调试模式下)并设置了正确的ID。

另一种方法是禁用“级联持久化/合并”并单独保存实体。它可以为您的数据提供更高的安全性。

您可以在此处找到更多信息:http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html