2012-01-22 11 views
16

Dovrei iniziare dicendo che sono abbastanza nuovo in Java EE e che non ho ancora un forte background teorico in Java.Come lavorare con le interfacce e JPA

Non riesco a capire come utilizzare JPA insieme a interfaces in Java. Per illustrare ciò che trovo difficile ho creato un esempio molto semplice.

Se ho due interfacce semplici Person e Pet:

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

public interface Pet 
{ 
    public String getName(); 
} 

E un'entità PersonEntity che implementa Person nonché una PetEntity che 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 */ 

} 

Come faccio a gestire correttamente il caso nel metodo setPet in cui voglio persistere le relazioni tra le due entità sopra?

Il motivo principale per cui voglio utilizzare le interfacce è perché voglio mantenere le dipendenze tra moduli/livelli nelle interfacce pubbliche. In quale altro modo evito di ottenere una dipendenza da ad es. il mio ManagedBean direttamente a un'entità?

Se qualcuno sconsiglia di utilizzare le interfacce sulle entità, spiegare per favore quali metodi alternativi o modelli esistono.

risposta

17

È possibile utilizzare la proprietà targetEntity nell'annotazione della relazione.

@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

Sei sicuro che funzionerà? Stai utilizzando l'accesso al campo implicito, ma imposta l'annotazione '@ OneToOne' sul setter. Inoltre, anche con l'accesso alla proprietà, questa annotazione funzionerà? Non dovrebbe essere su getter piuttosto che setter? –

+1

Mairbek, e per quanto riguarda il campo di miscelazione e l'accesso alla proprietà? Pensi che questa parte della specifica JPA 2.0 sia rilevante in questo caso: * "Il comportamento delle applicazioni che mescolano il posizionamento di annotazioni su campi e proprietà all'interno di una gerarchia di entità senza specificare esplicitamente l'annotazione di Access non è definito." *? –

+1

Funziona finché c'è solo 1 implementazione di Persona, naturalmente. Quando ne hai più di 1, avresti bisogno di supporto esplicito nell'implementazione per i campi dell'interfaccia – user383680

Problemi correlati