1

cxf(jax-rs)+ Struts2でOpenJPAを使用しています。外部トランザクションマネージャーはありません。「トランザクションがアクティブな間のみ操作を実行できます」と表示されるのはなぜですか?

persistence.xmlはこのようなものです:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="myPU"
        transaction-type="RESOURCE_LOCAL">

        <class>com.bb.bba.entity.Advertisement</class>
        <class>com.bb.bba.entity.Poi</class>

        <properties>
            <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.ClientDriver" />
            <property name="openjpa.ConnectionURL" value="jdbc:derby://localhost:1527/bba;create=true" />
            <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" />
            <property name="openjpa.DynamicEnhancementAgent" value="false" />
            <property name="openjpa.RuntimeUnenhancedClasses" value="supported" />
            <property name="openjpa.ConnectionUserName" value="APP" />
            <property name="openjpa.ConnectionPassword" value="asdasd" />
            <property name="openjpa.Log" value="SQL=TRACE"/>
        </properties>
    </persistence-unit>
</persistence>

次のエラーが発生します。

35692  2012-06-02 03:50:57,847 DEBUG [http-33791-1] resolver.DefaultTraversableResolver.initJpa (DefaultTraversableResolver.java:77) - Found javax.persistence.PersistenceUtil on classpath.
35729  2012-06-02 03:50:57,884 DEBUG [http-33791-1] resolver.DefaultTraversableResolver.initJpa (DefaultTraversableResolver.java:91) - Instantiated an instance of org.apache.bval.jsr303.resolver.JPATraversableResolver.
35755  2012-06-02 03:50:57,910 TRACE [http-33791-1] jsr303.DefaultMessageInterpolator.loadBundle (DefaultMessageInterpolator.java:189) - ValidationMessages not found by thread local classloader
35755  2012-06-02 03:50:57,910 TRACE [http-33791-1] jsr303.DefaultMessageInterpolator.loadBundle (DefaultMessageInterpolator.java:189) - ValidationMessages not found by validator classloader
35756  2012-06-02 03:50:57,911 DEBUG [http-33791-1] jsr303.DefaultMessageInterpolator.getFileBasedResourceBundle (DefaultMessageInterpolator.java:176) - ValidationMessages not found. Delegating to org.apache.bval.jsr303.ValidationMessages
35778  2012-06-02 03:50:57,933 DEBUG [http-33791-1] xml.ValidationParser.parseXmlConfig (ValidationParser.java:88) - No META-INF/validation.xml found. Using annotation based configuration only.
646  myPU  INFO   [http-33791-1] openjpa.Runtime - OpenJPA dynamically loaded a validation provider.
922  myPU  INFO   [http-33791-1] openjpa.Runtime - Starting OpenJPA 2.1.1
1703  myPU  INFO   [http-33791-1] openjpa.jdbc.JDBC - Using dictionary class "org.apache.openjpa.jdbc.sql.DerbyDictionary".
11326  myPU  WARN   [http-33791-1] openjpa.Enhance - Creating subclass for "[class com.bb.bba.entity.Poi, class com.bb.bba.entity.Advertisement]". This means that your application will be less efficient and will consume more memory than it would if you ran the OpenJPA enhancer. Additionally, lazy loading will not be available for one-to-one and many-to-one persistent attributes in types using field access; they will be loaded eagerly instead.

ここにいるよ

......致命的でないユーザーエラー>org.apache.openjpa.persistence.TransactionRequiredException:トランザクションがアクティブな間のみ操作を実行できます。org.apache.openjpa.kernel.BrokerImpl.assertActiveTransaction(BrokerImpl.java:4658)at org.apache.openjpa.kernel.DelegatingBroker.assertActiveTransaction(DelegatingBroker.java:1386)at org.apache.openjpa.persistence.EntityManagerImpl.flush (EntityManagerImpl.java:661)at com.bb.bba.dao.MyDao.createPoi(MyDao.java:21)at com.bb.bba.services.Service.createPoi(POIService.java:36)

4

2 に答える 2

3

EntityManager で操作を実行する前に、トランザクションを開く必要があります。それは予想される動作です。アプリケーションのトランザクション戦略がいくつか見つかります。そのため、どのコンポーネントがトランザクションを開くか (特にどのレイヤーで)、それがどのように行われるか (宣言的またはプログラム的) を決定する必要があります。

他にどのようなフレームワークを使用していますか? たとえば、Spring も使用している場合は、Spring の宣言型トランザクション管理サポートを使用して、トランザクションを非常に簡単に管理できます。

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html

于 2012-06-02T08:57:20.563 に答える
1

問題は解決された。私が使用してresource_localいたのは、私が取引の責任を負うという意味です。追加するem.getTransaction.beginと問題が解決しました。

于 2012-06-03T03:44:23.013 に答える