[英]Inherited abstract class with JPA (+Hibernate)
您將如何在以下示例代碼中配置注釋? 我只想堅持使用JPA注釋,並避免使用Hibernate特定的依賴項。 以下代碼是否正確?
@Entity
public class RefExample extends RefData {
}
(這些類將有多個版本,RefSomeOtherExample等,每個類有一個db表。有些可能會添加其他字段(列),但大多數只會使用從“RefData”基類繼承的基本字段。)
基類:
@Entity
public abstract class RefData {
private long id;
private String code;
private String desc;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, nullable = false)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Column(unique = true, nullable = false, length=8)
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@Column(unique = true, nullable = false, length=80)
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
最后,我想使用Hibernate的SchemaExport類從中生成模式創建腳本。 在上面的情況下,這兩個類應該只導致創建一個名為“RefExample”的表,其中包含“RefData”中的三列。 這會有用嗎?
從JPA 1.0規范:
抽象類和具體類都可以是實體。 抽象和具體類都可以使用實體注釋進行注釋 ,映射為實體,並作為實體進行查詢。
實體可以擴展非實體類,非實體類可以擴展實體類 。
如您所希望的那樣,您應該使用單表繼承。
只需定義一個鑒別器列,如下所示:
@Entity
@DiscriminatorColumn(name="REF_TYPE")
public abstract class RefData {
但是,如果您不想依賴JPA繼承策略,則可以使用MappedSuperclass:
@MappedSuperclass
public abstract class RefData {
JPA規范
實體可以從提供持久實體狀態和映射信息的超類繼承,但它本身不是實體。 通常,這種映射的超類的目的 是定義多個實體類共有的狀態和映射信息 。
請記住, 您不能同時使用@Entity和@MappedSuperclass。
@MappedSuperclass對我有用 。 我正在努力將視圖映射到2個父類和子類的對象。 我的觀點來自2個表格。 兩個表中的主鍵都存在於視圖中。 @DiscriminatorColumn對我來說不起作用,因為它需要一個專門分配給對象數據類型的'repeated Column in object exception'
並且它拋出'repeated Column in object exception'
,這是我無法解決的。
我讀了這個論壇,我嘗試了@MappedSuperclass注釋。 它成功了。
我把@MappedSuperclass放在超類中,並將@Id和@GeneratedValue放在超類標識符中。 在我給出的子類中
@Entity
@Table(name="view_name")
並使用子類對象從視圖中獲取數據。 而已。
使用@DiscriminatorColumn對已加入表的hibernate注釋進行繼承為我工作。
您可以使用其中一種繼承策略來實現此目的。 您的案例看起來是層次結構的Single類的情況。
檢查一下
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.