Hibernate: org.mise en veille prolongée.AssertionFailure: null id dans com.xxx.Bean entrée
J'ai été confronté à l'erreur suivante:
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract void com.xxx.Service.save(com.xxx.Bean)' threw an unexpected exception: org.hibernate.AssertionFailure: null id in com.xxx.Bean entry (don't flush the Session after an exception occurs)
at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:385)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:588)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
Caused by: org.hibernate.AssertionFailure: null id in com.xxx.Bean entry (don't flush the Session after an exception occurs)
at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:82)
at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
at com.xxx.ServiceImpl.save(ServiceImpl.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
... 23 more
Voici la table MySQL définition:
CREATE TABLE `tblARF` (
`ARF_ID` bigint(19) NOT NULL AUTO_INCREMENT,
`ARF_MANUFACTURER_MNF_ID` bigint(19) NOT NULL,
...
PRIMARY KEY (`ARF_ID`),
KEY `ARF_MANUFACTURER_MNF_ID` (`ARF_MANUFACTURER_MNF_ID`)
)
Et voici Hibernate mapping:
<class name="Bean" table="tblARF">
<id name="key" type="long" unsaved-value="null">
<column name="ARF_ID" not-null="true"/>
<generator class="identity" />
</id>
<many-to-one column="ARF_MANUFACTURER_MNF_ID" name="manufacturer"
class="ManufacturerBean" not-null="true" lazy="false"/>
...
</class>
De code Java:
Session s = hibernate.getCurrentSession();
Transaction t = s.beginTransaction();
s.merge(bean.getManufacturer());
s.save(bean);
t.commit();
J'ai remarqué que si je supprime KEY ARF_MANUFACTURER_MNF_ID (ARF_MANUFACTURER_MNF_ID)
que AssertionFailure
n'arrive pas. Est-il un moyen pour éviter cette erreur sans retirer la CLÉ?
Cette solution ne fonctionne pas pour moi malheureusement.
org.hibernate.AssertionFailure: null id in com.xxx.Bean entry (don't flush the Session after an exception occurs)
- Il doit y avoir un deuxième (et plus intéressant) (Affirmation)Exception-s'il vous Plaît poster tropJ'ai aded.
de réponses mis à jour (et désolé j'ai oublié la partie pertinente)
une autre mise à jour
OriginalL'auteur Antonio | 2011-02-24
Vous devez vous connecter pour publier un commentaire.
La réponse a été trouvée ici:
https://forum.hibernate.org/viewtopic.php?f=1&t=1009141
OriginalL'auteur Antonio
L'Exception que vous avez posté, a déclaré que le problème est:
Caused by: org.hibernate.AssertionFailure: null id in com.xxx.Bean entry (don't flush the Session after an exception occurs)
En veille prolongée, vous avez à jeter la Session Hibernate après une Session d'Exception liés se passe.
Mais je suppose que ce n'est pas votre question.
Vous devez définir l'ID de votre
Bean
ou de l'utilisation<generator class="native" />
(@GeneratedValue(strategy=GenerationType.AUTO)
) à la place.Ajouté
essayez de remplacer:
merge
parsave
<many-to-one column="ARF_MANUFACTURER_MNF_ID"
mais pas par la clé primaire.On peut donc avoir deux problèmes. Mais vous avez raison, le comportement que vous desciped dirait que vous n'avez pas défini la ManufacturerBean, si vous en avez besoin, ou de supprimer la contrainte de Non nullité de votre forain champ de clé.
Le mystère est que j'ai mis et il n'est pas nul, mais hibernate jette AssertionError 🙂
On dirait que vous devez vérifier les instructions SQL, peut-être cela vous donne un indice. (et j'espère que vous Perist la ManuacturingBean première)
J'ai ajouté le code java (au cas où)
OriginalL'auteur Ralph
Je ne suis pas sûr de savoir si c'est lié à ton problème, mais note la mauvaise utilisation de
merge()
.merge()
ne fait pas l'objet passé en elle persistante, elle renvoie un autre exemple avec le même état au lieu de cela, de sorte que vous devriez écrireOriginalL'auteur axtavt
Parfois la véritable erreur est ailleurs. Pour vérifier l'erreur exacte utiliser le mode de Débogage et de faire usage de printstacktrace() la méthode d'exception. Il vous donne l'explication plus détaillée. Dans mon cas, j'avais utilisé de la Chaîne où la colonne est de type int.
OriginalL'auteur user2539947