我想仅从子类
中将所有变量保存在超类中//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)
可行吗?如果是,怎么样?
答案 0 :(得分:5)
如果超类中的访问器未设置为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;
}
我使用您的代码创建了a sample application。下载应用程序并以mvn clean test
运行集成测试,并检查生成的SQL以查看所需的结果。
答案 1 :(得分:2)
你不能在这个例子中。超类中的实例变量是私有的,这意味着您的子类无法访问这些值。我只想创建自己的实例字段@YaWang建议,并在构造函数中将它们初始化为超类中的名称和信息getter的值。
答案 2 :(得分:1)
如果您可以向超类添加@MappedSuperclass注释,那么您将能够在超类中保留所有这些字段。由于忽略了未知注释,因此添加这可能是有可能的,并且对现有的api层功能没有影响。这种方法的唯一缺点是Api使用的类将被数据层注释破坏。
如果遇到映射问题,您可能还想使用@Access(AccessType.PROPERTY)
答案 3 :(得分:0)
对于Hibernate,可以通过在xml中定义数据映射文件来完成。请注意,映射使用的是get / set方法,而不是字段。不需要注释。对于您的情况,它将涉及创建具有以下内容的Empty DataFrame
Columns: [Unnamed: 0, Year, Month, Day, Hour, Temp, DewTemp, Pressure, WinDir, WindSpeed, Sky, Precip1, Precip6, ID, USAF_WBAN, STATION NAME, LAT, LON]
Index: []
。
ChildClass.hbm.xml
然后根据所使用的应用程序堆栈,从hibernate或spring配置加载此映射。保留<!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>
后,会将ChildClass
,id
和name
保存到info
表。
答案 4 :(得分:0)
这也可以在orm.xml中的JPA by using XML to override annotations中完成,而无需触及您的&#34; API&#34;类。该链接碰巧指向Hibernate的文档,但适用于任何JPA实现。与Hibernate的原生XML文件相反,JPA XML会覆盖注释,而不是替换注释,所以你只需要放置来自&#34; API&#34;的类就可以了。在那里。类似的东西:
<?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>
Haven未在上面进行测试,但不需要特定的属性,因为默认行为是持久存在。
BR, 延