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.
¿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? –
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." *? –
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