私の問題は一般的な問題であることは知っていますが、ここで多くの質問を確認し、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" />
ます-私は正しいですか?