如何在hibernate中保持子类中的超类变量?

时间:2016-01-28 01:29:27

标签: java 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)

可行吗?如果是,怎么样?

5 个答案:

答案 0 :(得分:5)

如果超类中的访问器未设置为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;
}

我使用您的代码创建了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> 后,会将ChildClassidname保存到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, 延