Mise à jour de données impossible : java.lang.IllegalArgumentException: Unknown entity:
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:
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:
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:
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:
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:
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:
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:
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:
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...