【问题标题】:EclipseLink TransactionRequiredExceptionEclipseLink TransactionRequiredException
【发布时间】:2014-12-16 16:50:05
【问题描述】:

我的项目中的交易有问题。 当我调用使用 sql 查询从数据库中删除行的方法时,出现错误: 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 方法(由于我现在无法访问原始代码而从内存中编写)

@Transactional
public void delete(Date d1, Date d2)
{

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

}
...

我使用executeUpdate方法执行查询

我的 glassfish-resources.xml:

<?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

<?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 与数据库通信。感谢您的帮助。

【问题讨论】:

    标签: java transactions eclipselink jta


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我忘记从我的 xhtml 页面粘贴代码 我以这种方式调用方法删除:

      <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部分源码:

      @ManagedBean(name = "planConfirmedController")
      @SessionScoped
      public class PlanConfirmedController implements Serializable {
      @EJB
      private pup_dao.PlanConfirmedFacade planConfirmedFacade ;
      

      我第一篇中删除方法中的planConfirmedFacde被称为ejbFacade(错误地)

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

      【讨论】:

        猜你喜欢
        • 2012-10-25
        • 2016-11-12
        • 1970-01-01
        • 2015-12-19
        • 1970-01-01
        • 2019-11-01
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多