2012-05-09 1 views
0

Disons que nous avons deux tables, ORDERS et OFFERSHibernate JPA hasUne cartographie?

Commander POJO

@Entity 
@Table(name = "ORDERS") 
public class Order { 

    @Column(columnDefinition = "serial") 
    private @Id Integer id; 
    private @NotNull @Email String ownerEmail; 
    private @NotNull Integer offerId; 
} 

Offre POJO

@Entity 
@Table(name = "OFFERS") 
public class Offer { 

    @Column(columnDefinition = "serial") 
    private @Id Integer id; 
    private @Email @NotNull String ownerId; 
} 

Est-il possible d'aller chercher dans la requête unique sur EntityManager Order by ID si que le résultat contiendra l'objet Offer associé?

Comme créer un champ @Transient Offer dans l'ordre, car nous ne voulons pas modifier les données de l'offre sur l'ordre persistant.

Ou le seul moyen est de créer deux requêtes?

Répondre

2

L'annotation @Transient sur le champ offer dans Order signifie que ce champ ne sera pas mappé et persistera. En effet, vous devez mapper ce champ mais le rendre en lecture seule en définissant ses @Column.insertable() et @Column.updatable() sur false.

@Entity 
@Table(name = "ORDERS") 
public class Order { 

    @Column(columnDefinition = "serial") 
    private @Id Integer id; 
    private @NotNull @Email String ownerEmail; 

    private @NotNull Integer offerId; 

    @Column(insertable=false , updateable=false) 
    private Offer offer; 
} 

Pour récupérer l'ordre ainsi que son offre liée à une seule requête, vous pouvez utiliser fetch rejoindre:

SELECT order FROM Order order join fetch order.offer 
+0

semble très bon, s'il vous plaît me donner un certain temps pour le tester;) –