gpt4 book ai didi

Spring事务上下文不持久化数据

转载 作者:行者123 更新时间:2023-12-04 21:24:57 24 4
gpt4 key购买 nike

我知道我的问题是一个常见问题,但是我在这里检查了很多问题,检查了 Spring 文档,我真的不知道我做错了什么。
我的问题:我有一个使用 JPA 的 Spring WebFlow 项目(实现:OpenJPA + MySQL 数据库)。我使用 Spring ORM 将 EntityManager(通过 @PersistenceContext 注释)注入(inject)我的简单 RegisterDAO。我已经为使用 MySQL 配置了 GlassFishs(我正在使用)连接池,并且一切正常 - 我可以使用我的数据库,但是当我持久化某些东西时 - 没有任何 react (数据不会持久化到数据库)。我知道问题在于我使用的事务上下文。我阅读了 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 注入(inject)到我的 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;
}

...
}

注册道:
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 注释。我像这样配置了spring 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:annotation-driven />
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />


</beans>

并使用 @Transactional 注释注释我的 addUser() 方法,如下所示:
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 代理有什么问题吗,因为我是这方面的新手(就像整个 Spring 一样 :))?

编辑:在我的 persistence.xml 我使用 transaction-type="JTA "所以我认为我应该在 applicationContext.xml 中使用 <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" /> - 对吗?

最佳答案

解决了我的问题

org.springframework.orm.jpa.JpaTransactionManager

所以你的 bean 应该是
 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" />

希望这项工作!

关于Spring事务上下文不持久化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5265783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com