Java/Hibernate 使用实体上的接口

2022-09-04 01:13:32

我正在使用带注释的Hibernate,我想知道以下内容是否可能。

我必须设置一系列表示可以持久化的对象的接口,以及一个主数据库类的接口,其中包含用于持久化这些对象的几个操作(...数据库的 API)。

在此之下,我必须实现这些接口,并使用Hibernate持久化它们。

例如,我将拥有:

public interface Data {
  public String getSomeString();
  public void setSomeString(String someString);
}

@Entity
public class HbnData implements Data, Serializable {
  @Column(name = "some_string")
  private String someString;

  public String getSomeString() {
    return this.someString;
  }
  public void setSomeString(String someString) {
    this.someString = someString;
  }
}

现在,这工作正常,某种程度上。当我想要嵌套实体时,麻烦就来了。我想要的界面非常简单:

public interface HasData {
  public Data getSomeData();
  public void setSomeData(Data someData);
}

但是当我实现该类时,我可以按照下面的接口进行操作,并从Hibernate收到一个错误,说它不知道类“Data”。

@Entity
public class HbnHasData implements HasData, Serializable {
  @OneToOne(cascade = CascadeType.ALL)
  private Data someData;

  public Data getSomeData() {
    return this.someData;
  }

  public void setSomeData(Data someData) {
    this.someData = someData;
  }
}

简单的更改是将类型从“Data”更改为“HbnData”,但这显然会破坏接口实现,从而使抽象变得不可能。

任何人都可以向我解释如何以一种与Hibernate一起工作的方式实现这一点?


答案 1

也许是OneToOne.targetEntity?:

@OneToOne(targetEntity = HbnData.class, cascade = CascadeType.ALL)
private Data someData;

答案 2

我通常使用的接口是数据访问对象或DAO。使用Java泛型,我可以只写一次;休眠也可以只写一次实现:

package persistence;

import java.io.Serializable;
import java.util.List;

public interface GenericDao<T, K extends Serializable>
{
    T find(K id);
    List<T> find();
    List<T> find(T example);
    List<T> find(String queryName, String [] paramNames, Object [] bindValues);

    K save(T instance);
    void update(T instance);
    void delete(T instance);
}