2011-07-05 4 views
1

Dans ma classe JPA Entité je:JPA & RequestFactory: persistance des clés étrangères

@Entity 
public class Booking { 
@Id 
@SequenceGenerator(name = "BOOKING", allocationSize = 1) 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BOOKING") 
private Integer id; 

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
@JoinColumn(nullable = false) 
private User user; 

// ... 
} 

Dans mon GWT Voir je:

MainRequestFactory.BookingRequest bookingRequest = reqFactory.bookingRequest(); 
    BookingProxy bookingProxy = bookingRequest.create(BookingProxy.class); 
    UserProxy userProxy = bookingRequest.create(UserProxy.class); 

    userProxy.setId(12); 

    bookingProxy.setUser(userProxy); 

    Request<Void> persistRequest = bookingRequest.persist().using(bookingProxy); 
    persistRequest.fire(new Receiver<Void>() { 
     @Override 
     public void onSuccess(Void response) { 
      GWT.log("persisted"); 
     } 
    }); 

////////// ///////////

Users et Bookings persistance sans la contrainte utilisateur fonctionne correctement. Mais avec le code ci-dessus que je veux/devoir attribuer à l'utilisateur avec l'ID « 12 » pour une nouvelle réservation. Mais je ne peux pas attribuer une nouvelle réservation à un ID utilisateur déjà existant 12. Je reçois l'erreur suivante:

[EL Warning]: 2011-07-05 18:48:45.464--UnitOfWork(267787945)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint "INTEG_388" on table "USERS2"

C'est parce qu'un utilisateur avec l'ID « 12 » existe déjà et JPA veut créer un nouvel utilisateur avec le même ID au lieu de créer une nouvelle réservation avec l'ID utilisateur "12" comme clé étrangère.

Comment puis-je dire RequestFactory de ne pas créer un nouvel utilisateur mais plutôt d'attribuer l'ID utilisateur d'un utilisateur déjà existant à une nouvelle entrée de réservation?

Répondre

4

Je pense que votre analyse du problème est correct.

Au lieu de créer un utilisateur, utilisez plutôt un EntityManager trouver() ou getReference() pour récupérer l'élément utilisateur existant.

+0

Pouvez-vous préciser un peu plus loin? Gardez à l'esprit que je peux parler aux classes de domaine uniquement via les classes de proxy de RequestFactory. – Alex

+0

J'ai essayé de remplacer "setUser (utilisateur utilisateur) {this.user = user;}" dans mon Booking.java avec setUser (Integer id) {UserController userController = new UserControllerImpl(); this.user = userController.getReference (id);} mais j'ai la même erreur. – Alex

+0

Je ne suis pas familier avec le GWT, ma lecture rapide des docs est venu à travers l'exemple requestFactory.employeeRequest(). FindEmployee (employeeId) en utilisant find() plutôt que create(), je suppose, mais conceptuellement cela ressemble ce dont vous avez besoin: trouver une entrée existante plutôt que d'en créer une nouvelle. – djna