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: Exception 説明: 切り離されたオブジェクト [com.mirodinero.entidad.DatosUsuario[idUsuario=Miguel LLorente]] を永続化できません。Class> com.mirodinero.entidad.DatosUsuario Primary Key> [Miguel LLorente] at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:224) at com.sun.enterprise.util. EntityManagerWrapper.persist(EntityManagerWrapper.java:440) で com.mirodinero.sessionBean.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 で。com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer. java:2920) com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4011) で com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:197) で ... 33 以上 原因:例外 [TOPLINK-7231] (Oracle TopLink Essentials - 2.1 (ビルド b60e-fcs (12/23/2008))): oracle.toplink.essentials.exceptions.ValidationException 例外の説明: 切り離されたオブジェクト [com.mirodinero.entidad. DatosUsuario[idUsuario=ミゲル・ロレンテ]]。Class> com.mirodinero.entidad.DatosUsuario Primary Key> [Miguel LLorente] at oracle.toplink.essentials.

この:

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;
    }
}

誰がエラーがどこにあるか知っていますか? 私のWebページでは、データが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));
}

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

4

2 に答える 2

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);
    }
}
于 2012-05-05T16:07:59.407 に答える
0

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

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

于 2012-05-05T16:05:08.227 に答える