2010-05-09 25 views
11

我使用annoted Hibernate,我想知道下面是否可能。通过实体使用接口的Java/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的工作?

+2

,什么是使用接口为实体的点?接口需要保持什么状态?接口是关于行为,而不是状态,我不明白你为什么想要坚持一个接口。 – 2010-05-09 22:12:50

+2

我意识到这一点... 其目的是创建一个对持久性框架的抽象,以便可以使用不同(或不)的框架多次实现它。 有问题的应用程序被设置为绝对模块化,超出了我的控制范围,我需要一种方法来指定数据库应该能够响应哪些消息以及对象具有哪些属性......等等:接口。 这个想法是可以实现接口和开关模块。但是,实现这些接口给Hibernate带来了一些麻烦......因此也是我的问题。 – wen 2010-05-09 22:47:19

回答

15

也许OneToOne.targetEntity ?:

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

谢谢,那实际上是我正在寻找的。 ^^ – wen 2010-11-02 14:02:44

+0

同样在这里!你是我的英雄! – nterry 2016-10-10 19:02:09

+0

我不明白这是如何解决问题的,它仍然局限于一种类型。用HbnData替换数据是否一样? – MilacH 2017-02-06 01:08:27

3

我通常使用的接口是数据访问对象或DAO。使用Java泛型,我可以只写一次; 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); 
}