Java/Hibernate с использованием интерфейсов над объектами

Я использую аннотированный 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, говоря, что он не знает класс "Данные".

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

Простым изменением будет изменение типа от "Данные" до "HbnData", но это, очевидно, нарушит реализацию интерфейса и, таким образом, сделает абстракцию невозможной.

Может кто-нибудь объяснить мне, как реализовать это так, чтобы он работал с Hibernate?

Ответ 1

Возможно, OneToOne.targetEntity?:

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

Ответ 2

Интерфейс, который я обычно использую, - это объект доступа к данным или DAO. Используя Java generics, я могу написать его только один раз; Спящий режим позволяет писать реализацию только один раз:

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