首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >EclipseLink TransactionRequiredException

EclipseLink TransactionRequiredException
EN

Stack Overflow用户
提问于 2014-12-17 00:50:06
回答 2查看 299关注 0票数 0

我对我的项目中的事务有问题。当我调用使用sql query从数据库中删除行的方法时,我得到错误:Warning: /class/HistoryList.xhtml @28,245 actionListener="#{planConfirmedController.delete(planController.historyDate,planController.selectedDate)}": javax.persistence.TransactionRequiredException: executeUpdate is not supported for a Query object obtained through non-transactional access of a container-managed transactional EntityManager javax.el.ELException: /class/HistoryList.xhtml @28,245 actionListener="#{planConfirmedController.delete(planController.historyDate,planController.selectedDate)}": javax.persistence.TransactionRequiredException: executeUpdate is not supported for a Query object obtained through non-transactional access of a container-managed transactional EntityManager at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:111) at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:147) at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88) at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:813) at javax.faces.component.UICommand.broadcast(UICommand.java:300) ......................

下面是查询:

"DELETE c FROM Class c WHERE c.classname = :classname"

delete方法(从内存中写入,因为我现在无法访问原始代码)

代码语言:javascript
运行
复制
@Transactional
public void delete(Date d1, Date d2)
{

...
Query q = ejbFacade.createNamedQuery("..") ;
q.executeUpdate() ;

}
...

I使用executeUpdate方法执行查询

我的glassfish-resources.xml:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
<parametr-encoding default-charset="UTF-8"/>
<jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="mysql_pup_rootPool" non-transactional-connections="false" ping="false" pool-resize-quantity="2" pooling="true" res-type="javax.sql.DataSource" statement-cache-size="0" statement-leak-reclaim="false" statement-leak-timeout-in-seconds="0" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">        <property name="serverName" value="...."/>
    <property name="portNumber" value="3306"/>
    <property name="databaseName" value="pup"/>
    <property name="User" value="username"/>
    <property name="Password" value="password"/>
    <property name="URL" value="jdbc:mysql://....:3306/pup?useUnicode=true&amp;characterEncoding=UTF-8"/>
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    </jdbc-connection-pool>
    <jdbc-resource enabled="true" jndi-name="pup" object-type="user" pool-name="mysql_pup_rootPool"/>
</resources>

和persistance.xml

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="pupPU" transaction-type="JTA">
    <jta-data-source>pup</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties/>
  </persistence-unit>
</persistence>

使用eclipselink与数据库通信的应用程序。谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2014-12-17 01:15:21

看看调用@Transactional注释方法的代码会很有帮助。

确保在调用方法时,您使用的是框架创建的方法存根,而不是直接使用的方法。

换句话说,假设此方法是在某个EJB中编写的,则应该使用注入的EJB实例从EJB客户端调用该方法,而不是从EJB实例本身内部调用该方法。

票数 0
EN

Stack Overflow用户

发布于 2014-12-17 02:38:54

我忘了粘贴我的xhtml页面中的代码,我以这种方式调用了delete方法:

代码语言:javascript
运行
复制
<p:commandButton id="deleteButton" icon="ui-icon-trash"  value="#{bundle.Delete}" actionListener="#{planConfirmedController.delete(planController.historyDate,planController.selectedDate)}" update=":growl,:ClassListForm">
     <p:confirm header="Usunięcie" message="Czy napewno chcesz usunąć wpis z historii dla aktualnie wybranych danych?" icon="ui-icon-alert" />  
</p:commandButton>

planConfirmedController源代码的一部分:

代码语言:javascript
运行
复制
@ManagedBean(name = "planConfirmedController")
@SessionScoped
public class PlanConfirmedController implements Serializable {
@EJB
private pup_dao.PlanConfirmedFacade planConfirmedFacade ;

我在delete方法中的第一篇文章中的planConfirmedFacde被称为ejbFacade (错误地)

,好的,我终于解决了这个问题。事务无法工作,因为在控制器中,我使用@ManagedBean而不是@Named注解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27509751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档