2010-05-09 17 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); 
}