2012-01-22 15 views
16

Debo comenzar diciendo que soy bastante nuevo en Java EE y que aún no tengo una base teórica sólida en Java.Cómo trabajar con interfaces y JPA

Tengo problemas para entender cómo usar JPA junto con interfaces en Java. Para ilustrar lo que encuentro difícil, creé un ejemplo muy simple.

Si tengo dos interfaces simples Person y Pet:

public interface Person 
{ 
    public Pet getPet(); 
    public void setPet(Pet pet); 
} 

public interface Pet 
{ 
    public String getName(); 
} 

y una entidad PersonEntity que implementa Person, así como un PetEntity que implementa Pet:

@Entity 
public class PersonEntity implements Person 
{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    private PetEntity pet; 

    @Override 
    public void setPet(Pet pet) 
    { 
     /* How do i solve this? */ 
    } 
} 

@Entity 
public class PetEntity implements Pet 
{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    private String name; 

    /* Getters and Setters omitted */ 

} 

¿Cómo manejar apropiadamente la caso en el método setPet en el que quiero persistir las relaciones entre las dos entidades anteriores?

La razón principal por la que quiero utilizar interfaces es porque deseo mantener las dependencias entre módulos/capas en las interfaces públicas. ¿De qué otra manera evito obtener una dependencia de, por ejemplo, mi ManagedBean directamente a una Entidad?

Si alguien recomienda no utilizar interfaces en entidades, explique qué métodos alternativos o patrones existen.

Respuesta

17

Puede usar la propiedad targetEntity en la anotación de relación.

@Entity 
public class PersonEntity implements Person { 
    private Long id; 

    private Pet pet; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Override 
    @OneToOne(targetEntity = PetEntity.class) 
    public Pet getPet() { 
     return pet; 
    }   

    public void setPet(Pet pet) { 
     this.pet = pet; 
    } 
} 
+1

¿Estás seguro de que funcionará? Está utilizando acceso de campo implícito, pero establezca la anotación '@ OneToOne' en el setter. Además, incluso con el acceso a la propiedad, ¿funcionará esta anotación? ¿No debería estar en getter en lugar de setter? –

+1

Mairbek, y ¿qué tal mezclar el campo con el acceso a la propiedad? ¿Cree que esta parte de la especificación de JPA 2.0 es relevante en este caso? * "El comportamiento de las aplicaciones que mezclan la colocación de anotaciones en campos y propiedades dentro de una jerarquía de entidades sin especificar explícitamente la anotación de acceso no está definido." *? –

+1

Funciona siempre que haya solo 1 implementación de Persona, por supuesto. Cuando tiene más de 1, necesita apoyo explícito en la implementación de campos de interfaz – user383680

Cuestiones relacionadas