栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在EJB / JPA环境中优雅地处理约束违规?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在EJB / JPA环境中优雅地处理约束违规?

我得到的异常是无用的“ javax.ejb.EJBException:事务异常中止”。(…)

我进行了测试(使用GFv3和Eclipselink),并确认了这一行为。完整的堆栈跟踪为:

javax.ejb.EJBException:事务中止    在com.sun.ejb.containers.baseContainer.completeNewTx(baseContainer.java:4997)    在com.sun.ejb.containers.baseContainer.postInvokeTx(baseContainer.java:4756)    在com.sun.ejb.containers.baseContainer.postInvoke(baseContainer.java:1955)    在com.sun.ejb.containers.baseContainer.postInvoke(baseContainer.java:1906)    在com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)    在com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)    在$ Proxy218.myBusinessMethod(未知来源)    com.stackoverflow.q2522643处。__EJB31_Generated__MyEJB__Intf ____ Bean __。myBusinessMethod(未知来源)    在com.stackoverflow.q2522643.MyServlet.doGet(MyServlet.java:28)    在javax.servlet.http.HttpServlet.service(HttpServlet.java:734)    在javax.servlet.http.HttpServlet.service(HttpServlet.java:847)    在org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)    在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)    在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)    在org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)    在com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)    在com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)    在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)    在org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332)    在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233)    在com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)    在com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)    在com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)    在com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)    在com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)    在com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)    在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)    在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)    在com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)    在com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)    在com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)    在com.sun.grizzly.ContextTask.run(ContextTask.java:69)    在com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:330)    在com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:309)    在java.lang.Thread.run(Thread.java:619)原因:javax.transaction.RollbackException:事务标记为回滚。    在com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:450)    在com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:837)    在com.sun.ejb.containers.baseContainer.completeNewTx(baseContainer.java:4991)    ...另外34个由以下原因引起:异常[Eclipselink-4002](Eclipse Persistence Services-2.0.0.v20091127-r5931):org.eclipse.persistence.exceptions.DatabaseException内部异常:java.sql.SQLIntegrityConstraintViolationException:该语句被中止,因为它会在“ MYENTITY”上定义的“ SQL100326111558470”标识的唯一或主键约束或唯一索引中导致重复的键值。错误代码:-1致电:插入MYENTITY(ID,NAME)值(?,?)    绑定=> [2,公爵!]查询:InsertObjectQuery(com.stackoverflow.q2522643.MyEntity@dba6a9)    在org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)    在org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:800)    在org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:866)    在org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:586)    在org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:529)    在org.eclipse.persistence.internal.sessions.AbstractSession.executeCall(AbstractSession.java:914)    在org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:205)    在org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:191)    在org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:334)    在org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:162)    在org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:177)    在org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:461)    在org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80)    在org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90)    在org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:286)    在org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58)    在org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:675)    在org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:589)    在org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:109)    在org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:86)    在org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2863)    在org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1225)    在org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1207)    在org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1167)    在org.eclipse.persistence.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:197)    在org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:103)    在org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:3260)    在org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1405)    在org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:547)    在org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1510)    在org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.issueSQLbeforeCompletion(UnitOfWorkImpl.java:3134)处    在org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.issueSQLbeforeCompletion(RepeatableWriteUnitOfWork.java:268)    在org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:157)    在org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68)处    在com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:412)    ...另外36个原因:java.sql.SQLIntegrityConstraintViolationException:该语句被中止,因为它会导致在“ MYENTITY”上定义的“ SQL100326111558470”标识的唯一或主键约束或唯一索引中重复键值。    在org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(未知来源)    在org.apache.derby.client.am.SqlException.getSQLException(未知来源)    在org.apache.derby.client.am.PreparedStatement.executeUpdate(未知来源)    在com.sun.gjc.spi.base.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:108)    在org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:791)    ...更多69由以下原因引起:org.apache.derby.client.am.SqlException:该语句被中止,因为它会在“ MYENTITY”上定义的“ SQL100326111558470”标识的唯一或主键约束或唯一索引中导致重复的键值。    在org.apache.derby.client.am.Statement.completeExecute(未知来源)    在org.apache.derby.client.net.NetStatementReply.parseEXCSQLSTTreply(未知来源)    在org.apache.derby.client.net.NetStatementReply.readExecute(未知来源)    在org.apache.derby.client.net.StatementReply.readExecute(未知来源)    在org.apache.derby.client.net.NetPreparedStatement.readExecute_(未知来源)    在org.apache.derby.client.am.PreparedStatement.readExecute(未知来源)    在org.apache.derby.client.am.PreparedStatement.flowExecute(未知来源)    在org.apache.derby.client.am.PreparedStatement.executeUpdateX(未知来源)    ...另外72个

如我们所见,Eclipselink实际上抛出了一个

o.e.p.e.DatabaseException
然后被容器捕获的。但这是
错误的
。Eclipselink应该抛出一个
PersistenceException
(来自JPA)或一个(如果它是其子类),但肯定不是提供程序特定的异常。这

一个错误,您应该这样报告:https :
//glassfish.dev.java.net/servlets/ProjectIssues(在
实体持久 性子组件中)。

你是绝对正确的,你应该 赶供应商特定的例外便携性的缘故。您应该捕获一个JPA

PersistenceException
或一个子类(然后看一下包装好的
SQLException
)。在这种特殊情况下,由于Eclipselink错误,您可能不得不(临时),但这是一种解决方法。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496788.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号