2010-05-09 19 views
11

Estoy usando anotado Hibernate, y me pregunto si lo siguiente es posible.Java/Hibernate usando interfaces sobre las entidades

Tengo que configurar una serie de interfaces que representan los objetos que pueden persistir, y una interfaz para la clase de base de datos principal que contiene varias operaciones para persistir estos objetos (... una API para la base de datos).

Debajo de eso, tengo que implementar estas interfaces y persistirlas con Hibernate.

Así que voy a tener, por ejemplo:

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

Ahora bien, esto funciona bien, algo así. El problema surge cuando quiero entidades anidadas. La interfaz de lo que me gustaría es bastante fácil:

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

Pero cuando implemente la clase, que puede seguir la interfaz, como abajo, y obtener un error de Hibernate diciendo que no sabe la clase "Datos".

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

El simple cambio sería cambiar el tipo de "datos" a "HbnData", pero que, obviamente, romper la implementación de la interfaz, y por lo tanto hacer que la abstracción imposible.

¿Alguien me puede explicar cómo implementar esto de manera que funcione con Hibernate?

+2

Y lo que es el punto de utilizar las interfaces para las entidades? ¿Qué estado tiene una interfaz que necesita persistir? Las interfaces se refieren al comportamiento, no al estado, y no veo por qué le gustaría mantener una interfaz. –

+2

Me doy cuenta de esto ... La intención era crear una abstracción sobre el marco de persistencia, para que sea posible implementarla varias veces, utilizando diferentes (o no) marcos. La aplicación en cuestión ha sido configurada de forma absolutamente modular, de forma que escapa a mi control, y necesito una forma de especificar a qué mensajes la base de datos debería poder responder y qué propiedades tienen los objetos ... y así: interfaces. La idea es que uno podría implementar las interfaces y cambiar los módulos. Sin embargo, implementar las interfaces genera algunos problemas con Hibernate ... y de ahí mi pregunta. – wen

Respuesta

15

Tal OneToOne.targetEntity ?:

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

Gracias, eso era realmente lo que estaba buscando. ^^ – wen

+0

¡Lo mismo aquí! ¡Eres mi héroe! – nterry

+0

No veo cómo esto resuelve el problema, todavía está limitado a un tipo. Reemplazar datos por HbnData es el mismo no? – MilacH

3

La interfaz que suelo usar es Data Access Object, o DAO. Utilizando los genéricos de Java, puedo escribirlo solo una vez; Hibernate hace posible la escritura de la aplicación una sola vez, también:

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