Bonjour,

je suis un peu perdu et j'ai besoin d'une aide extérieur. J'ai des soucis pour mapper une classe d'association avec des attributs.
Le mapping en lui-même, j'ai trouver des solution sur le net.
Par contre pour le merge en cascade, j'ai constemment des exceptions.

Est-ce possible? comment?

Dans mon cas, je cherche à persister un "travelRequest" avec sa liste de "requestMember".

Concrétement, lorsque je lance ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
@Test
  public final void testAddingTravelWithMember(){
    TravelRequest travelRequest = new TravelRequest();
 
    RequestMember requestMember = new RequestMember();
    requestMember.setTravelRequest(travelRequest);
    requestMember.setMember(member);
 
    travelRequest.getRequestMembers().add(requestMember);
    member.getRequestMembers().add(requestMember);
 
    travelRequest = emTest.update(travelRequest);
    Assert.assertNotNull(travelRequest.getTravelRequestId());
  }
j'obtiens l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
javax.persistence.EntityNotFoundException: Unable to find com.traveldoo.ejb.entities.RequestMember with id com.traveldoo.ejb.entities.RequestMemberPk@a0c486
	at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:133)
	at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:233)
	at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:285)
	at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:152)
...

Voici les extraits de code appelé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
@Entity
@Table(name = "TRAVEL_REQUEST")
public class TravelRequest implements Serializable {
  private static final long serialVersionUID = 1L;
 
  @Id
  @Column(name = "TRAVEL_REQUEST_ID", unique = true, nullable = false, precision = 10)
  @GeneratedValue(generator = "SEQUENCE_TRAVEL_REQUEST_ID")
  @SequenceGenerator(name = "SEQUENCE_TRAVEL_REQUEST_ID", sequenceName = "SEQUENCE_TRAVEL_REQUEST")
  private Long travelRequestId;
 
 ...
 
  @OneToMany(mappedBy = "travelRequest")
  private List<RequestAction> actions = new ArrayList<RequestAction>();
 
  @OneToMany(mappedBy = "travelRequest")
  private List<RequestMember> requestMembers = new ArrayList<RequestMember>();
 
...
la classe d'association

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Entity
@Table(name = "REQUEST_MEMBERS")
public class RequestMember implements Serializable {
  private static final long serialVersionUID = 1L;
 
  @EmbeddedId
  private RequestMemberPk pk = new RequestMemberPk();
 
  @ManyToOne
  @JoinColumn(name = "TRAVEL_REQUEST_ID", insertable = false, updatable = false)
  private TravelRequest travelRequest;
 
  @ManyToOne
  @JoinColumn(name = "MEMBER_ID", insertable = false, updatable = false)
  private Member member;
 
...
la pk :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
@Embeddable
public class RequestMemberPk implements Serializable {
  private static final long serialVersionUID = 5089975622327078543L;
 
  @Column(name = "TRAVEL_REQUEST_ID", nullable = false)
  private Long travelRequestId;
 
  @Column(name = "MEMBER_ID", nullable = false)
  private Long memberId;
 
...
l'autre classe utilisé pour la pk :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Entity
@Table(name = "MEMBER")
public class Member implements Serializable {
  private static final long serialVersionUID = 1L;
 
  @Id
  @Column(name = "MEMBER_ID", unique = true, nullable = false, precision = 10)
  @GeneratedValue(generator = "SEQUENCE_MEMBER_ID")
  @SequenceGenerator(name = "SEQUENCE_MEMBER_ID", sequenceName = "SEQUENCE_MEMBER")
  private Long memberId;
...
 
  @OneToMany(mappedBy = "member", cascade = ALL)
  private List<Profile> profiles = new ArrayList<Profile>();
 
  @OneToMany(mappedBy = "member")
  private List<RequestMember> requestMembers = new ArrayList<RequestMember>();
Voilà, si vous avez des piste n'hésitez pas à me les soumettre. Merci