bonjour,

Dans mon projet utilisant les EJB3 sur un serveur JBoss 4.2.2 et Hibernate 3.3.1, j'ai un EJB entity de cette forme:

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
22
23
24
25
26
27
28
29
30
31
@Entity
public class UserGroupEntite
{
 
	private Collection<UserEntite>	user;
	private Collection<RoleEntite>	role;
 
	// ....
 
	@ManyToMany(mappedBy = "userGroup")
	public Collection<UserEntite> getUser()
	{
		return this.user;
	}
 
	public void setUser(Collection<UserEntite> user)
	{
		this.user = user;
	}
 
	@ManyToMany(mappedBy = "userGroup")
	public Collection<RoleEntite> getRole()
	{
		return role;
	}
 
	public void setRole(Collection<RoleEntite> role)
	{
		this.role = role;
	}
}

Et je souhaiterais pouvoir charger explicitement dans une requête HQL les collections de User et/ou de Role.

La requête HQL est la suivante:

SELECT e FROM UserGroupEntite e LEFT OUTER JOIN FETCH e.user LEFT OUTER JOIN FETCH e.role

Seulement, si j'essaye de charger les deux collections en même temps, il me sort l'exception:

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
11:00:22,368 ERROR [STDERR] javax.ejb.EJBException: org.hibernate.HibernateException: cannot simultaneously fetch multiple bags
11:00:22,369 ERROR [STDERR] 	at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:63)
11:00:22,369 ERROR [STDERR] 	at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
11:00:22,369 ERROR [STDERR] 	at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
11:00:22,369 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
11:00:22,369 ERROR [STDERR] 	at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95)
11:00:22,583 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
11:00:22,583 ERROR [STDERR] 	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
11:00:22,583 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
11:00:22,583 ERROR [STDERR] 	at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
11:00:22,583 ERROR [STDERR] 	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110)
11:00:22,583 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
11:00:22,583 ERROR [STDERR] 	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
11:00:22,583 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
11:00:22,583 ERROR [STDERR] 	at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
11:00:22,583 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
11:00:22,583 ERROR [STDERR] 	at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:240)
11:00:22,583 ERROR [STDERR] 	at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:210)
11:00:22,583 ERROR [STDERR] 	at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:84)
11:00:22,584 ERROR [STDERR] 	at $Proxy273.executeGetQuerry(Unknown Source)
En cherchant un peu, j'ai trouvé deux solutions possible:
1) ajouter l'annotation @IndexColumn(name="INDEX_COL") sur les méthodes:
Malheureusement, il n'a aucun effet...
http://www.jroller.com/eyallupu/entr..._multiple_bags

2) Ajouter l'annotation @CollectionId(columns = @Column(name = "USERCOL_ID"), type = @Type(type = "string"), generator = "system-uuid")
seulement, là il me dit que le generator est inconnu... alors que c'est ce même generator que j'utilise pour générer les identifiants de mes objets.
http://www.jroller.com/eyallupu/entr...etch_multiple1