簡體   English   中英

如何在hibernate中保持子類中的超類變量?

[英]how can I persist a superclass variables from child class in hibernate?

我想僅從子類中將所有變量保存在超類中

例:

//This class is from an API, I cannot touch or change
class SuperClass {
    private String name;
    private String info;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
}

@Entity
class ChildClass extends SuperClass {
    @id
    private long id;
}

我希望表有這些列(id,name,info)

它可行嗎? 如果是,怎么樣?

如果訪問器未在超類中設置為final ,則可以在子類中覆蓋它們,並將JPA注釋添加到重寫的訪問器方法中。

例1


class SuperClass { public String getName() { ... } public String getInfo() { ... }

@Entity
class ChildClass extends SuperClass {
  @Id
  private long id;

  public Long getId() { return id; }

  @Access(AccessType.PROPERTY)
  @Column(name = "name")
  public String getName() { return super.getName(); }

  @Access(AccessType.PROPERTY)
  @Column(name = "info")
  public String getInfo() { return super.getInfo(); }
}

例2


class SuperClass { public String getName() { ... } public String getInfo() { ... }

@MappedSuperClass
class NamedModel extends SuperClass {
  @Access(AccessType.PROPERTY)
  @Column(name = "name")
  public String getName() { return super.getName(); }

  @Access(AccessType.PROPERTY)
  @Column(name = "info")
  public String getInfo() { return super.getInfo(); }
}

@Entity
class ChildClass extends NamedModel {
  @Id
  private long id;
}

我使用您的代碼創建了一個示例應用程序 下載應用程序並將集成測試作為mvn clean test運行,並檢查生成的SQL以查看所需的結果。

你不能在這個例子中。 超類中的實例變量是私有的,這意味着您的子類無法訪問這些值。 我只是創建你自己的實例字段@YaWang建議,並在構造函數中將它們初始化為超類中的名稱和信息getter的值。

如果您可以將@MappedSuperclass注釋添加到超類中,那么您將能夠在超類中保留所有這些字段。 由於忽略了未知注釋,因此添加這可能是有可能的,並且對現有的api層功能沒有影響。 這種方法的唯一缺點是Api使用的類將被數據層注釋破壞。

如果您遇到映射問題,您可能還想使用@Access(AccessType.PROPERTY)

對於Hibernate,可以通過在xml中定義數據映射文件來完成。 請注意,映射使用的是get / set方法,而不是字段。 不需要注釋。 對於您的情況,它將涉及創建具有以下內容的ChildClass.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="ChildClass" table="child_class">
        <id name="id" column="id" type="integer"/>
        <property name="name" column="name" type="string"/>
        <property name="info" column="info" type="string"/>
    </class>
</hibernate-mapping>

然后根據所使用的應用程序堆棧,從hibernate或spring配置加載此映射。 ChildClass被持久化時,它會將idnameinfo保存到child_class表中。

這也可以在JPA中通過使用XML覆蓋 orm.xml中的注釋來完成,而無需觸及“API”類。 該鏈接碰巧指向Hibernate的文檔,但適用於任何JPA實現。 與Hibernate的原生XML文件相反,JPA XML會覆蓋注釋而不是替換注釋,因此只需將“API”中的類放在那里就可以了。 就像是:

<?xml version="1.0" encoding="UTF-8"?> <entity-mappings version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"   
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd">

  <mapped-superclass class="SuperClass" />
  </mapped-superclass>
</entity-mappings>

上面沒有測試過,但是不需要特定的屬性,因為默認行為是持久化所有。

br,Jens

暫無
暫無

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

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