简体   繁体   English

Java / Hibernate使用实体上的接口

[英]Java/Hibernate using interfaces over the entities

I am using annoted Hibernate, and I'm wondering whether the following is possible. 我正在使用带注释的Hibernate,我想知道以下是否可行。

I have to set up a series of interfaces representing the objects that can be persisted, and an interface for the main database class containing several operations for persisting these objects (... an API for the database). 我必须设置一系列表示可以持久保存的对象的接口,以及一个主数据库类的接口,该接口包含用于持久存储这些对象的几个操作(...数据库的API)。

Below that, I have to implement these interfaces, and persist them with Hibernate. 在此之下,我必须实现这些接口,并使用Hibernate持久化它们。

So I'll have, for example: 所以我会,例如:

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;
  }
}

Now, this works fine, sort of. 现在,这种方法很好,有点像。 The trouble comes when I want nested entities. 当我想要嵌套实体时,麻烦来了。 The interface of what I'd want is easy enough: 我想要的界面很简单:

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

But when I implement the class, I can follow the interface, as below, and get an error from Hibernate saying it doesn't know the class "Data". 但是当我实现该类时,我可以按照下面的界面进行操作,并从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;
  }
}

The simple change would be to change the type from "Data" to "HbnData", but that would obviously break the interface implementation, and thus make the abstraction impossible. 简单的改变是将类型从“数据”更改为“HbnData”,但这显然会破坏接口实现,从而使抽象变得不可能。

Can anyone explain to me how to implement this in a way that it will work with Hibernate? 任何人都可以向我解释如何以一种可以与Hibernate一起使用的方式实现它?

Maybe OneToOne.targetEntity?: 也许OneToOne.targetEntity?:

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

The interface that I usually use is Data Access Object, or DAO. 我通常使用的接口是数据访问对象或DAO。 Using Java generics, I can write it just once; 使用Java泛型,我只能写一次; Hibernate makes it possible to write the implementation just once, too: Hibernate也可以只编写一次实现:

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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM