簡體   English   中英

使用JPA(+ Hibernate)繼承抽象類

[英]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.

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