6

私の問題は一般的な問題であることは知っていますが、ここで多くの質問を確認し、Springのドキュメントを確認しましたが、何が間違っているのか本当にわかりません。私の問題:JPAを使用したSpring WebFlowプロジェクトがあります(実装:OpenJPA + MySQLデータベース)。Spring ORMを使用して、EntityManagerを(@PersistenceContextアノテーションによって)単純なRegisterDAOに挿入します。MySQLを使用するためにGlassFishs(使用している)接続プールを構成しましたが、すべてが機能します-データベースで作業できますが、何かを永続化すると何も起こりません(データはデータベースに永続化されません)。問題は、私が使用するトランザクションコンテキストにあることを知っています。Spring Transaction Managementのドキュメントを読み、このドキュメントの構成手順に従います。これは私のapplicationContext.xmlです:

<?xml version="1.0" encoding="windows-1250"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">

    <jee:jndi-lookup id="entityManagerFactory" jndi-name="myPersistenceUnit"/> 
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

    <bean id="registerDaoImpl" class="umk.dumont.db.dao.RegisterDAO" />
    <bean id="registerModel" class="umk.dumont.models.RegisterFormModel">
        <property name="registerDAO" ref="registerDaoImpl" />
    </bean>


  <tx:advice id="txAdvice">
    <tx:attributes>
      <tx:method name="*" />
    </tx:attributes>
  </tx:advice> 

  <aop:config>
    <aop:pointcut id="registerModelOperation" expression="execution(* umk.dumont.models.RegisterFormModel.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="registerModelOperation"/>
  </aop:config>

  <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />


</beans>

ご覧のとおり、RegisterDAOをRegisterFormModelに挿入しています。これには、レジスタフォームデータを検証し、最終的にデータベースにユーザーを追加するためのビジネスロジックが含まれています。検証は正常に機能します。新しいユーザーを追加しようとすると問題が発生します。コードは次のとおりです。

package umk.dumont.models;

...

public class RegisterFormModel implements Serializable {
    private String login;
    private String password;
    private String email;
    @Autowired
    private RegisterDAO registerDAO = null;

...

public boolean addUser()
    {
        MyUser user = new MyUser();
        user.setLogin(login);
        user.setPassword(password);
        user.setEmail(email);
        return registerDAO.insertUserIntoDB(user) == 0 ? true : false;
    }

...
}

RegisterDAO:

public class RegisterDAO implements RegisterDAOInterface, Serializable {
    private EntityManager em;

    @PersistenceContext
    public void setEm(EntityManager em)
    {
        this.em = em;
    }


...
public int insertUserIntoDB(MyUser user)
    {
        int result = -4;
        try {
            em.persist(user);
            result = 0;

        }
        catch(Exception ex)
        {
            ex.printStackTrace();
            result = -4;
        }
        finally {

            return result;
        }
    }
...
}

@Transactionalアノテーションも試してみました。SpringapplicationContext.xmlを次のように構成しました。

<?xml version="1.0" encoding="windows-1250"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">



    <jee:jndi-lookup id="entityManagerFactory" jndi-name="myPersistenceUnit"/> 
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
    <bean id="registerDaoImpl" class="umk.dumont.db.dao.RegisterDAO" />
    <bean id="registerModel" class="umk.dumont.models.RegisterFormModel">
        <property name="registerDAO" ref="registerDaoImpl" />
    </bean>


  <tx:annotation-driven />
  <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />


</beans>

そして、私のaddUser()メソッドに次のような@Transactionalアノテーションを付けました。

package umk.dumont.models;

...

public class RegisterFormModel implements Serializable {
    private String login;
    private String password;
    private String email;
    @Autowired
    private RegisterDAO registerDAO = null;

...
@Transactional
public boolean addUser()
    {
        MyUser user = new MyUser();
        user.setLogin(login);
        user.setPassword(password);
        user.setEmail(email);
        return registerDAO.insertUserIntoDB(user) == 0 ? true : false;
    }

...
}

または、この注釈によってクラス全体に注釈を付けることもできます。

package umk.dumont.models;

...
@Transactional    
public class RegisterFormModel implements Serializable {
    private String login;
    private String password;
    private String email;
    @Autowired
    private RegisterDAO registerDAO = null;

...
public boolean addUser()
    {
        MyUser user = new MyUser();
        user.setLogin(login);
        user.setPassword(password);
        user.setEmail(email);
        return registerDAO.insertUserIntoDB(user) == 0 ? true : false;
    }

...
}

しかし、どちらの場合も問題は同じです-データはデータベースに保存されません。私はこれの初心者なので(春全体のように:))、AOPプロキシに問題はありますか?

編集:persistence.xmlでtransaction-type="JTA「」を使用しているので、applicationContext.xmlで使用する必要があると思い<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />ます-私は正しいですか?

4

3 に答える 3

1

JPA エンティティーマネージャーを使用するコードのバージョン。em.persist() の後に em.flush() を追加してみてください - em.persist() が行うことは、エンティティを永続化コンテキストにアタッチすることだけです。その時点で、エンティティは「永続化」されていません。

em.flush() は必要ありませんが、役立つかどうか試してみてください。

トランザクションが終了すると、永続コンテキストが自動的にフラッシュされます (データベースに書き込まれます)。

ここでは非常に複雑な設定になっていると言わざるを得ません。絞り込むには、試行錯誤が必要になる場合があります。JTA をミックスに追加しても問題が解決しない場合があります。機能するまで、Spring で「リソースローカル」を試すことができます。ログにエラーはありますか?

于 2011-03-10T22:50:06.933 に答える
0

たぶんこれが役立ちます:

JNDI の場合、このポストプロセッサの「persistenceUnits」マップで対応する JNDI 名を指定します。通常は、Java EE デプロイメント記述子で一致する persistence-unit-ref エントリを使用します。デフォルトでは、これらの名前は「java:comp/env/」名前空間の下にあるリソース参照と見なされます (Java EE リソース参照規則に従って)。例えば:

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor">
    <property name="persistenceUnits">
        <map>
            <entry key="unit1" value="persistence/unit1"/>
            <entry key="unit2" value="persistence/unit2"/>
        </map>
    </property>
</bean>

から:

http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.html

于 2011-03-10T22:48:51.193 に答える