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 :
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 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)
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 + "]"; } }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
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 + "]"; } }
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 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); } }
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); }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 @Service(value = MessageDao.class, locator = InjectingServiceLocator.class) public interface MessageService extends RequestContext { Request<List<MessageProxy>> getAll(); Request<Void> persist(MessageProxy message); }
Quelqu'un voit il d'où peut provenir cette erreur ?
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); } }); }
Merci par avance pour vos pistes, aides...
Partager