2010-05-09 22 views
11

Używam przypisanego Hibernate i zastanawiam się, czy jest to możliwe.Java/Hibernacja przy użyciu interfejsów nad jednostkami

Muszę skonfigurować serię interfejsów reprezentujących obiekty, które mogą być utrwalone, oraz interfejs dla głównej klasy bazy danych zawierający kilka operacji utrzymywania tych obiektów (... API dla bazy danych).

Poniżej, muszę zaimplementować te interfejsy i utrzymywać je z Hibernate.

Więc będę mieć, na przykład:

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

Teraz, to działa dobrze, w pewnym sensie. Problem pojawia się, gdy chcę zagnieżdżonych obiektów. Interfejs czego chcę jest dość prosta:

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

Ale kiedy zaimplementować klasę, mogę śledzić interfejs, jak poniżej, i pojawia się błąd z Hibernate, mówiąc, że nie wie, klasę "Dane".

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

Prosta zmiana byłoby zmienić typ z „dane” do „HbnData”, ale to oczywiście przerwać realizację interfejsu, a tym samym sprawiają, że abstrakcja niemożliwe.

Czy ktoś może mi wyjaśnić, jak zaimplementować to w sposób, który będzie działał z Hibernate?

+2

A jaki jest sens korzystania z interfejsów dla podmiotów? Jaki stan ma interfejs, który musi być utrzymywany? Interfejsy dotyczą zachowania, a nie stanu i nie rozumiem, dlaczego chciałbyś utrzymywać interfejs. –

+2

Zdaję sobie sprawę, że ... Zamiarem było stworzenie abstrakcji dotyczącej struktury trwałości, aby umożliwić jej wdrożenie kilkukrotnie, przy użyciu różnych (lub żadnych) ram. Aplikacja, o której mowa, została skonfigurowana w sposób całkowicie modułowy, w sposób niezależny od mojej kontroli i potrzebuję sposobu na określenie, na jakie wiadomości powinna odpowiadać baza danych i jakie właściwości mają obiekty ... i tak: interfejsy. Chodzi o to, że można implementować interfejsy i przełączać moduły. Jednak implementacja interfejsów powoduje problemy z Hibernate ... i stąd moje pytanie. – wen

Odpowiedz

15

Maybe OneToOne.targetEntity ?:

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

Dzięki, to było to, czego szukałem. ^^ – wen

+0

To samo tutaj! Jesteś moim bohaterem! – nterry

+0

Nie widzę, jak to rozwiązuje problem, jest nadal ograniczone do jednego typu. Zastąp dane przez HbnData jest taki sam nie? – MilacH

3

Interfejs, którego zwykle używam, to obiekt dostępu do danych lub DAO. Używając generycznych Java, mogę napisać to tylko raz; Hibernate pozwala pisać realizację tylko raz, za:

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); 
} 
Powiązane problemy