[英]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注釋添加到重寫的訪問器方法中。
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(); }
}
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
被持久化時,它會將id
, name
和info
保存到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.