2012-05-05 14 views
0

を持続することはできません私はpostresqlデータベースに接続するJavaエンタープライズ・アプリケーションでの作業、およびログファイルに、このエラーが原因は分離オブジェクト

javax.ejb.EJBException 
at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:3894) 
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3794) 
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3596) 
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1379) 
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:205) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:127) 
at $Proxy120.create(Unknown Source) 
at com.mirodinero.web.servlets.setMisDatos.processRequest(setMisDatos.java:111) 
at com.mirodinero.web.servlets.setMisDatos.doGet(setMisDatos.java:140) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:315) 
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) 
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288) 
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647) 
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579) 
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831) 
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) 
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) 
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) 
at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) 
at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106) 

表示されています:javax.persistence.EntityExistsException: 例外説明を:分離されたオブジェクトを永続化できません[com.mirodinero.entidad.DatosUsuario [idUsuario = Miguel LLorente]]。 クラス> com.mirodinero.entidad.DatosUsuario主キー> [Miguel LLorente] oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:224) at com.sun.enterprise .util.EntityManagerWrapper.persist(EntityManagerWrapper.java:440)com.mirodinero.sesionBean.DatosUsuarioFacade.create(DatosUsuarioFacade.java:30)で sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で sun.reflectで 。 NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)で java.lang.reflect.Method.invoke(Method.java:597)で はcom.sunで 。 enterprise.security.application.EJBSecurityManager.runMeth od(EJBSecurityManager.java:1011) at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:175) at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2920) at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4011) com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:197) ... 33 more 原因:例外[ TOPLINK-7231](Oracle TopLink Essentials - 2.1(ビルドb60e-fcs(12/23/2008))):oracle.toplink.essentials.exceptions.ValidationException 例外説明:分離されたオブジェクトを永続化できません[com.mirodinero.entidad.DatosUsuario [idUsuario = Miguel LLorente]]。 クラス> com.mirodinero.entidad.DatosUsuario主キー> [Miguel LLorente] oracle.toplink.essentials.exceptions.ValidationException.cannotPersistExistingObject(ValidationException.java:2171) oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersistで.registerNotRegisteredNewObjectForPersist(UnitOfWorkImpl.java:3257)oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.registerNotRegisteredNewObjectForPersist(RepeatableWriteUnitOfWork.java:432)で (UnitOfWorkImpl.java:3226) oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:221) ... 44 more

と、この:

javax.persistence.NoResultException: getSingleResult() did not retrieve any entities. 
at oracle.toplink.essentials.internal.ejb.cmp3.EJBQueryImpl.throwNoResultException(EJBQueryImpl.java:274) 
at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.getSingleResult(EJBQueryImpl.java:513) 
at com.mirodinero.sesionBean.DatosUsuarioFacade.findById(DatosUsuarioFacade.java:57) 
at sun.reflect.GeneratedMethodAccessor560.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1011) 
at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:175) 
at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2920) 
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4011) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:197) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:127) 
at $Proxy120.findById(Unknown Source) 
at com.mirodinero.web.servlets.setMisDatos.processRequest(setMisDatos.java:96) 
at com.mirodinero.web.servlets.setMisDatos.doGet(setMisDatos.java:140) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:315) 
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) 
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288) 
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647) 
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579) 
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831) 
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) 
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) 
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) 
at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) 
at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106) 

ので、私は、エラーが表示され、コードはこのようなファイルを確認するために行ってきました:エラーがどこにある

public DatosUsuario findById(String id) { 
    DatosUsuario du = null; 
    try { 
     du = (DatosUsuario) em.createNamedQuery("DatosUsuario.findByIdUsuario").setParameter("idUsuario", id).getSingleResult(); 
    } catch (Exception nre) { 
     log.error("No existe el usuario: " + id + ", ex: ", nre); 
    } finally { 
     log.debug("du: " + du); 
     return du; 
    } 
} 

誰もが知っているのですか?私のウェブページでは、3回のうち2回のデータを保存するように見えるからです。

はい、実際にEntityExistExpectionがここに与えられます。

public void create(DatosUsuario datosUsuario) { 
    em.persist(datosUsuario); // in this line 
} 

public void edit(DatosUsuario datosUsuario) { 
    em.merge(datosUsuario); 
} 

public void remove(DatosUsuario datosUsuario) { 
    em.remove(em.merge(datosUsuario)); 
} 

しかし、私は適切な、新しいユーザーを作成するために必要とされていると思いますか?ユーザーが存在するかどうかを確認してからデータを編集する必要がありますか?どのようにそれを行うことができますか?

+0

永続化されていない分離オブジェクトを取得しようとするコードが表示されているので、 'NoResultException'が表示されます。エンティティが最初に分離されている理由を理解するには、 'com.mirodinero.sesionBean.DatosUsuarioFacade.create'を見る必要があります。 –

答えて

1

em.persist()の代わりにem.merge()を実行する必要があるため、EntityExistsExceptionがスローされる可能性があります。

エンティティが新規でなく保存される必要がある場合、クライアントによって呼び出されるsave()メソッドを作成する必要があります。

public void save(DatosUsuario datosUsuario) { 
    em.merge(datosUsuario); 
} 

また、create()メソッドを保持し、エンティティがまだ永続化されているかどうかを確認することもできます。 @Idと@GeneratedValue(strategy = GenerationType.AUTO)を持つエンティティは、永続化された場合にのみIDを持ちます。したがって、このようなものが動作する可能性があります:

public void createOrSave(DatosUsuario datosUsuario) { 
    if (datosUsuario.getId() == null){ 
     em.persist(datosUsuario); 
    } 
    else{ 
     em.merge(datosUsuario); 
    } 
} 
+0

これはまったく答えではありません。これはコメントです。誰が "私にもっと情報をくれ"と答えた人は誰にアップアップしますか? –

+0

良い点、私はコメント機能をもっと使います。回答が改善されました。 –

+0

実際に私はすでにsave()関数を持っていましたが、コピーしませんでした。私はあなたのコードに非常によく似たコードを書いていましたが、if条件に.getIDを入れていないと...まだ完璧に動作しているかどうかわからないので、新しいユーザーが自分の問題を解決するかどうかをテストしなければなりません。 – Stefano

0

最初の例外は、いくつかの理由があるオブジェクトが切り離されていることが原因です。それは終了したトランザクションの一部であったか、閉じられたコンテキストの一部であった。新しいトランザクション/コンテキストでそれを使用する場合は、エンティティマネージャーでマージを呼び出す必要があります。

投稿した最後の例外は、データベースにオブジェクトが存在しないfindById関数にIDを渡すことによって発生します。 getSingleResult()の動作は、結果が1つも正確でない場合に例外をスローすることです。