JEE、eclipselink、glassfish4.0 无法持久化实体

Posted

技术标签:

【中文标题】JEE、eclipselink、glassfish4.0 无法持久化实体【英文标题】:JEE, eclipselink, glassfish4.0 can't persist entity 【发布时间】:2016-01-23 07:53:56 【问题描述】:

我正在开发的休息应用程序有一个奇怪的问题。

我创建了实体类和 dao 类来管理它们。现在,当我将应用程序部署到服务器时,我可以看到我的数据库模式正在更新。现在我有了这个:

@无状态 @Produces("文本/纯文本") @Path("cc") 公共类 HelloService @EJB 私有域道道; @得到 @Path("/put") 公共字符串 put() 域 d = 新域(); d.setName("名称"); d.setActive(true); d.setCreationDate(新日期()); d.setLastModificationDate(新日期()); dao.create(d); 返回“完成”; @得到 @Path("/get") 公共字符串获取() 返回 dao.find(1l).getName(); @得到 @Path("/你好") 公共字符串消息() 返回“嗨”;

部署后,我手动将一行插入到我的表中。当我通过浏览器调用 get() 方法时,我可以看到它正常工作,因为显示了正确的信息。 但是,当我调用 put() 方法时,我得到了一个异常。

[2015-10-23T18:53:47.137+0200] [glassfish 4.0] [警告] [] [javax.enterprise.web] [tid: _ThreadID=24 _ThreadName=http-listener-1(5)] [timeMillis: 1445619227137 ] [levelValue: 900] [[ StandardWrapperValve [pl.kacperb333.restApp.MainApp]:Servlet pl.kacperb333.restApp.MainApp 的 Servlet.service() 抛出异常 javax.transaction.xa.XAException: java.lang.IllegalStateException: 此 Web 容器尚未启动 在 com.sun.enterprise.resource.ConnectorXAResource.handleResourceException (ConnectorXAResource.java:115) 在 com.sun.enterprise.resource.ConnectorXAResource.rollback(ConnectorXAResource.java:215) 在 com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:488) 在 com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:854) 在 com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:719) 在 com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:503) 在 com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4475) 在 com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2009) 在 com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1979) 在 com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:220) 在 com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) 在 com.sun.proxy.$Proxy315.test(未知来源) 在 pl.kacperb333.restApp.webservices.__EJB31_Generated__HelloService__Intf____Bean__.test(未知来源) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:125) 在 org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:195) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:91) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:346) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:341) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:101) 在 org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:224) 在 org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 在 org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 在 org.glassfish.jersey.internal.Errors.process(Errors.java:315) 在 org.glassfish.jersey.internal.Errors.process(Errors.java:297) 在 org.glassfish.jersey.internal.Errors.process(Errors.java:267) 在 org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 在 org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:198) 在 org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:946) 在 org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:323) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:372) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:218) 在 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 在 com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188) 在 org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191) 在 org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168) 在 org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189) 在 org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) 在 org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 在 org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) 在 org.glassfish.grizzly.strategies.Abstractiostrategy.fireIOEvent(AbstractIOStrategy.java:113) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) 在 org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) 在 org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) 在 java.lang.Thread.run(Thread.java:745) ]]

我已经在这个问题上工作了 2 天,但我没有想法。

这里是实体类和dao类:

抽象实体:

@MappedSuperclass 公共抽象类 AbstractEntity 实现 IAbstractEntity 私人布尔活动; @Temporal(TemporalType.DATE) 私人日期创建日期; @Temporal(TemporalType.DATE) 私人日期 lastModificationDate; @覆盖 公共布尔 getActive() 返回活跃; @覆盖 公共无效setActive(布尔活动) this.active = 活跃的; @覆盖 公共日期 getCreationDate() 返回创建日期; @覆盖 公共无效 setCreationDate(创建日期) this.creationDate = 创建日期; @覆盖 公共日期 getLastModificationDate() 返回最后修改日期; @覆盖 公共无效 setLastModificationDate(日期 lastModificationDate) this.lastModificationDate = lastModificationDate;

实体:

@实体 公共类域扩展 AbstractEntity 实现 IDomain @ID @GeneratedValue(策略 = GenerationType.IDENTITY) 私有长域ID; @ManyToMany(targetEntity = Company.class, mappedBy = "domains") 私人集合公司; @OneToMany(targetEntity = Offer.class) @JoinColumn(name = "offerId") 私人名单优惠; 私有字符串名称; @覆盖 公共长 getDomainId() 返回域ID; @覆盖 公共无效 setDomainId(长域 ID) this.domainId = domainId; @覆盖 公共设置 getCompanies() 退货公司; @覆盖 公共无效 setCompanies(设置公司) this.companies = 公司; @覆盖 公共列表 getOffers() 退货优惠; @覆盖 公共无效 setOffers(列出报价) this.offers = 优惠; @覆盖 公共字符串 getName() 返回名称; @覆盖 公共无效集合名称(字符串名称) this.name = 名称;

抽象道:

公共抽象类 AbstractDao 私有类实体类; 公共抽象道(类实体类) this.entityClass = 实体类; 受保护的抽象 EntityManager getEntityManager(); 公共无效创建(T实体) getEntityManager().persist(实体); 公共无效编辑(T实体) getEntityManager().merge(实体); 公共无效删除(T实体) getEntityManager().remove(getEntityManager().merge(entity)); 公共 T 查找(对象 id) 返回 getEntityManager().find(entityClass, id); 公共列表 findAll() javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); cq.select(cq.from(entityClass)); 返回 getEntityManager().createQuery(cq).getResultList(); 公共列表 findRange(int[] range) javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); cq.select(cq.from(entityClass)); javax.persistence.Query q = getEntityManager().createQuery(cq); q.setMaxResults(范围[1] - 范围[0] + 1); q.setFirstResult(范围[0]); 返回 q.getResultList(); 公共整数计数() javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); javax.persistence.criteria.Root rt = cq.from(entityClass); cq.select(getEntityManager().getCriteriaBuilder().count(rt)); javax.persistence.Query q = getEntityManager().createQuery(cq); `在此处输入代码`return ((Long) q.getSingleResult()).intValue();

域道:

@无状态 @LocalBean 公共类 DomainDao 扩展 AbstractDao @PersistenceContext(unitName = "rekruterPU") 私人 EntityManager em; @覆盖 受保护的 EntityManager getEntityManager() 返回 em; 公共域道() 超级(域。类);

我不认为问题出在实体或 dao 类中,因为 EntityManager (find()) 的至少一种方法有效。我将不胜感激并提供帮助。

【问题讨论】:

发布的异常是根本原因。最上面的是:javax.servlet.ServletException:javax.ejb.EJBException:无法完成容器管理的事务。 Jaqen,问题确实出在persistence.xml中。我已将 ddl-generation 的属性更改为特定于 eclipselink(),它现在可以正常工作。以前它是 。是的,abstract dao 来自 Netbeans,但它只是为了提供对数据库的快速访问,因为我想尝试学习 REST。感谢您的帮助。 【参考方案1】:

正如@kacperb333 所建议的,标准持久性属性是 EclipseLink 中此错误的原因。

不要使用:

<property name="javax.persistence.schema-generation.database.action" value="create"/>

改为使用:

<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>

【讨论】:

以上是关于JEE、eclipselink、glassfish4.0 无法持久化实体的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有任何 IDE 或 GlassFish 等任何其他附加软件的情况下安装和使用 JEE [重复]

java 使用java EclipseLink / MOXy提供程序(glassfish 4.0.1和JUnit4)解组json字符串和json文件

EclipseLink 的 @UuidGenerator 导致 NullPointerException

Mysql/Glassfish 资源 jdbc 无效

没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。 -- Netbeans、Postgresql 8.4 和 Glassfish

使用 Sniffy 指定的 Oracle URL 无效