Bonjour à tous,

J'ai un souci à l'utilisation d'un éditeur de données de base de données en GWT :

En fait, j'essaye d'éditer un objet Message qui a une relation par clé étrangère vers l'objet MessageType.
MessageType est un référentiel de valeurs.
Message est une instance de l'objet avec plusieurs données propres (nom, description, etc...)
Ce que je souhaite faire est de pouvoir modifier cette relation au niveau du Message.

Lorsque je crée le message avec ma relation, tout se passe sans problème.

Lorsque je souhaite modifier l'objet Message, j'obtiens le message d'erreur suivant :
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
28 mars 2013 19:21:49 com.google.web.bindery.requestfactory.server.RequestFactoryServlet doPost
GRAVE: Unexpected error
java.lang.IllegalArgumentException: Unknown entity: com.cacf.iaf.server.domain.MessageType_$$_javassist_13
	at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:793)
	at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:756)
	at com.cacf.iaf.server.locator.EntityLocator.find(EntityLocator.java:28)
	at com.cacf.iaf.server.locator.EntityLocator.find(EntityLocator.java:14)
	at com.google.web.bindery.requestfactory.shared.Locator.isLive(Locator.java:96)
	at com.google.web.bindery.requestfactory.server.LocatorServiceLayer.doIsLive(LocatorServiceLayer.java:188)
	at com.google.web.bindery.requestfactory.server.LocatorServiceLayer.isLive(LocatorServiceLayer.java:85)
	at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.isLive(ServiceLayerDecorator.java:116)
	at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.isLive(ServiceLayerDecorator.java:116)
	at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.createReturnOperations(SimpleRequestProcessor.java:274)
	at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:232)
	at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:127)
	at com.google.web.bindery.requestfactory.server.RequestFactoryServlet.doPost(RequestFactoryServlet.java:133)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263)
	at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:178)
	at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91)
	at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:62)
	at com.google.inject.persist.PersistFilter.doFilter(PersistFilter.java:89)
	at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163)
	at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
	at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
	at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.Server.handle(Server.java:324)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Caused by: org.hibernate.MappingException: Unknown entity: com.cacf.iaf.server.domain.MessageType_$$_javassist_13
	at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:693)
	at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:92)
	at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1090)
	at org.hibernate.impl.SessionImpl.get(SessionImpl.java:1005)
	at org.hibernate.impl.SessionImpl.get(SessionImpl.java:998)
	at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:781)
Pour cela j'ai défini mes deux entités :
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
@Entity
@Table(name = "Message")
public class Message extends EntityBase {
	private static final long serialVersionUID = 1L;
 
	@Column(name = "description", unique = false, nullable = true, length = 100)
	private String description;
 
	@Column(name = "used")
	private Boolean used;
 
	@Column(name = "wavFile", unique = false, nullable = true, length = 20)
	private String wavFile;
 
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "type", referencedColumnName = "id")
	private MessageType messageType;
 
	@OneToMany(targetEntity = Dnis.class, fetch = FetchType.LAZY, mappedBy = "flashMsg")
	private List<Dnis> dnis;
 
	public Message() {
		super();
	}
 
	public String getDescription() {
		return description;
	}
 
	public void setDescription(String description) {
		this.description = description;
	}
 
	public Boolean isUsed() {
		return used;
	}
 
	public void setUsed(Boolean used) {
		this.used = used;
	}
 
	public String getWavFile() {
		return wavFile;
	}
 
	public void setWavFile(String wavFile) {
		this.wavFile = wavFile;
	}
 
	public void setMessageType(MessageType messageType) {
		this.messageType = messageType;
	}
 
	public MessageType getMessageType() {
		return messageType;
	}
 
	public void setDnis(List<Dnis> dnis) {
		this.dnis = dnis;
	}
 
	public List<Dnis> getDnis() {
		return dnis;
	}
 
	@Override
	public boolean equals(Object o) {
		if (!(o instanceof Message)) {
			return false;
		}
		return id.longValue() == ((Message) o).id.longValue();
	}
 
	@Override
	public int hashCode() {
		return new StringBuilder().append(id).append(description).toString().hashCode();
	}
 
	@Override
	public String toString() {
		return "Message [id=" + id + ", description=" + description + "]";
	}
}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
@Entity
@Table(name = "MessageType")
public class MessageType extends EntityBase {
	private static final long serialVersionUID = 1L;
 
	@Column(name = "name", unique = false, nullable = false, length = 30)
	private String name;
 
	@OneToMany(targetEntity = Message.class, fetch = FetchType.LAZY, mappedBy = "messageType")
	private List<Message> message;
 
	public MessageType() {
		super();
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public void setMessage(List<Message> message) {
		this.message = message;
	}
 
	public List<Message> getMessage() {
		return message;
	}
 
	@Override
	public boolean equals(Object o) {
		if (!(o instanceof MessageType)) {
			return false;
		}
		return id.longValue() == ((MessageType) o).id.longValue();
	}
 
	@Override
	public int hashCode() {
		return new StringBuilder().append(id).append(name).toString().hashCode();
	}
 
	@Override
	public String toString() {
		return "MessageType [id=" + id + ", name=" + name + "]";
	}
}
Dans la DAO de message, j'ai deux méthodes (getAll et persist) :
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
 
public class MessageDao {
	@Inject
	Provider<EntityManager> emProvider;
 
 
	@Transactional
	public List<Message> getAll(){
		CriteriaBuilder cb = emProvider.get().getCriteriaBuilder();
		CriteriaQuery<Message> c = cb.createQuery(Message.class);
		Root<Message> r = c.from(Message.class);
 
		Fetch<Message,MessageType> type = r.fetch("messageType", JoinType.LEFT);
 
		c.select(r);
		TypedQuery<Message> q = emProvider.get().createQuery(c);
 
		return q.getResultList();
	}
 
	@Transactional
	public void persist(Message entity) {
		emProvider.get().persist(entity);
	}
}
Coté Client, j'ai créé mes deux Proxy + Mon service :
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
 
@ProxyFor(value = Message.class, locator = EntityLocator.class)
public interface MessageProxy extends EntityProxy {
	public Long getId();
 
	public String getDescription();
 
	public void setDescription(String description);
 
	public Boolean isUsed();
 
	public void setUsed(Boolean used);
 
	public String getWavFile();
 
	public void setWavFile(String wavFile);
 
	public MessageTypeProxy getMessageType();
 
	public void setMessageType(MessageTypeProxy messageType);
 
	public List<DnisProxy> getDnis();
 
	public void setDnis(List<DnisProxy> dnis);
 
	@Override
	EntityProxyId<MessageProxy> stableId();
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
@ProxyFor(value = MessageType.class, locator = EntityLocator.class)
public interface MessageTypeProxy extends EntityProxy {
	public Long getId();
 
	public String getName();
 
	public void setName(String name);
 
	public List<MessageProxy> getMessage();
 
	public void setMessage(List<MessageProxy> message);
 
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
@Service(value = MessageDao.class, locator = InjectingServiceLocator.class)
public interface MessageService extends RequestContext {
 
	Request<List<MessageProxy>> getAll();
 
	Request<Void> persist(MessageProxy message);
 
}
Et voici ma manière d'appeler mes deux méthodes côté client :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
	public void addMessage(RequestContext context, MessageProxy message) {
		MessageService service = (MessageService)context;
		service.persist(message).getRequestContext().fire();
		}
 
		public void getMessages(){
		requestFactory.messageService().getAll().with("messageType").fire(new Receiver<List<MessageProxy>>(){
			@Override
			public void onSuccess(List<MessageProxy> response) {
				messageWidget.setMessageStore(response);
			}	
		});
		}
Quelqu'un voit il d'où peut provenir cette erreur ?

Merci par avance pour vos pistes, aides...