簡體   English   中英

JPA實體映射繼承

[英]JPA Entity Mapping Inheritance

我對JPA實體映射有疑問。 我有一些課:

A類

@Entity
public class ClassA {

private int id;

@OneToMany
private List<ClassB> listClassB;
}

B級

@Entity
public class ClassB {

private int id;

@ManyToOne
private ClassA classA;

@OneToMany
private List<ClassC> listClassC;
}

C類

@Entity
public class ClassC {

private int id;

@ManyToOne
private ClassB classB;

    private String code;
    private String name;

@OneToMany
private List<ClassD> listClassD;
}

D類

@Entity
public class ClassD {
    private int id;
    private Long value;
    private Date startDate;
    private Date finishDate;

@ManyToOne
    private ClassC classC;
}

現在,我想擁有另一個具有ClassC的所有屬性和關聯的實體,並擁有自己的屬性(值是與Class C相關的ClassD的編號)。 當我像這樣使用類繼承時:

E級

@Entity
public Class ClassE extends ClassC {

    // All ClassC properties

    private Long numberOfClassD;
}

它拋出com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:“字段列表”中的未知列“ pegawai0_.DTYPE”。 缺少“鑒別符”列導致“可能”。 但就我而言,我沒有區分列。

*如何解決此問題?*我仍然可以使用類繼承嗎? 還是另一種解決方法?

謝謝。

在該示例中,ClassC和ClassE均已標記有@Entity,因此使用了“按類分類的表”繼承策略。 默認情況下,區分符列名稱為“ DTYPE”。

您可以在'ClassC'上使用'每個類的表'層次結構策略進行嘗試。 但是,生成的表與“每個類的表”有很大不同。

您可能想根據域模型檢查所需的繼承策略。 該鏈接將是對此的很好指南: http : //docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch10.html

就像Alan Hay在評論中建議的那樣,ClassC和ClassE在數據庫中沒有任何關系。 因此,使用@MappedSuperclass可以解決此問題。

我是這樣實現的:

@MappedSuperclass
public Class SuperClass {

    private int id;

    @ManyToOne
    private ClassB classB;

    private String code;
    private String name;

    @OneToMany
    private List<ClassD> listClassD;

}

@Entity
@Table(name = "table_name")
public Class ClassC extends SuperClass {

    // No Property

}

@Entity
@Table(name = "table_name")
public Class ClassE extends SupperClass {

    private String classECustomValue;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM