当前位置: 首页 > 知识库问答 >
问题:

Spring 4,JBoss 7,@Configuration Bean等效XML-Spring事务

夏博
2023-03-14

看起来EntityManager并没有清除对数据库的更改。使这个问题更难的是没有引发异常。我使用声明性事务通过以下流程定义事务边界:

注册控制器--

根据我的调查,似乎:

1.Spring使用@Transactional正确定义了事务边界。因此,正在创建交易

2.另请注意我正在使用SharedEntityManagerBean,这意味着我无法明确定义我的事务边界,例如:

em.getTransaction().begin();
em.persist(entity);
em.getTransaction().commit();

上述代码导致以下异常:不允许在共享EntityManager上创建事务-改用Spring事务或EJB CMT

以下是相关代码和配置。如有任何帮助,我们将不胜感激。谢谢

主配置。java:

@Configuration
@ComponentScan(basePackages="com",excludeFilters=                {@Filter(Configuration.class)})
@EnableTransactionManagement
public class MainConfig  {

@Bean
public DataSource dataSource() {
DataSource ds = (DataSource)getFromInitialContext("java:jboss/datasources/PrimaryDB");
return ds;
}

@Bean
public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(dataSource());
}

@Bean
public EntityManagerFactory entityManagerFactory() {
   EntityManagerFactory emf = (EntityManagerFactory) getFromInitialContext("java:jboss/entityManagerFactory");
return emf;
}

private Object getFromInitialContext(String jndiValue) {
    Context ctx = null;
    Object object = null;
try {
  ctx = new InitialContext();
  object = ctx.lookup(jndiValue);
} catch (NamingException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}
return object;
}
}

persistance.xml:

<persistence-unit name="PrimaryDB" transaction-type="JTA">
    <jta-data-source>java:jboss/datasources/PrimaryDB</jta-data-source>
    <class>com.domain.entities.Account</class>
    <properties>
        <!-- Bind entity manager factory to JNDI at java:jboss/myEntityManagerFactory -->
        <property name="jboss.entity.manager.factory.jndi.name"
            value="java:jboss/entityManagerFactory" />

        <!-- Properties for Hibernate -->
        <property name="hibernate.hbm2ddl.auto" value="create-drop" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.use_sql_comments" value="true" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
    </properties>
</persistence-unit>

AccountServiceImpl:

@Service
public class AccountServiceImpl implements AccountService {

  @Inject
  AccountDAO accountDAOImpl;

  @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
  public Account createAccount(SignupForm form, BindingResult formBinding) {
               TransactionDebugUtil.transactionRequired("AccountServiceImpl.createAccount");
   Account account =
        new Account(form.getUsername(), form.getPassword(),form.getFirstName(), form.getLastName());
    try {
      accountDAOImpl.createAccount(account);
    } catch (Exception ex) {
      formBinding.rejectValue("username", "user.duplicateUsername",
          "already in use: " + ex.getMessage());
      return null;
    }
    return account;
  }
}

AccountDAOImpl。java:

@Repository
public class AccountDAOImpl extends GenericJpaDAO<Account> implements    AccountDAO {

  @Override
  @PersistenceContext
  public void setEntityManager(EntityManager entityManager) {
   this.entityManager = entityManager;
   entityManager.setFlushMode(FlushModeType.COMMIT);
  }

 @Override
 public void createAccount(Account account) throws     UsernameAlreadyInUseException {
    entityManager.persist(account);
 }

共有3个答案

欧阳飞章
2023-03-14

您没有正确处理事务管理。将您的事务管理器bean替换为:

@Bean
public PlatformTransactionManager transactionManager() {
   final JpaTransactionManager txManager = new JpaTransactionManager();
   txManager.setEntityManagerFactory(entityManagerFactory());
   return txManager;
}
应俊爽
2023-03-14

当我们在持久方法上没有@transactional时,通常会发生这种行为。

因此,在如下方法的顶部添加事务性

@Override
@Transactional
 public void createAccount(Account account) throws     UsernameAlreadyInUseException {
    entityManager.persist(account);
 }
慕麒
2023-03-14

嗨,混淆是由于使用注释来配置事务管理器而不是XML造成的。

SpringTransaction的典型XML配置:

1.

<tx:annotation-driven /> 

^它扫描应用程序上下文中的所有bean,并为带注释的bean创建AOPhtml" target="_blank">拦截器。这是通过TransactionInterceptor使用的SpringTransactionAnnotationParser完成的。

@EnableTransactionManagement

^这是允许事务支持的等效配置bean注释

2.JTA数据源在持久性中定义。xml。JBoss 7自动创建JTA事务管理器,并将其绑定到以下JNDI位置:默认情况下为java:/TransactionManager。此事务管理器在spring中使用以下xml配置自动发现:

<tx:jta-transaction-manager />

这方面的等效注释配置为:

@Bean
public PlatformTransactionManager transactionManager() {
   JtaTransactionManager txManager = new JtaTransactionManager();
   return txManager;
}

这解决了我的问题。谢谢你的帮助。

 类似资料:
  • 问题内容: 有没有办法从XML打开Spring的Async配置?我看到的所有示例都使用程序化上下文声明和使用 是否有与此等效的XML。在某些地方,我看到有人在使用它,但这并未提及async。 我正在使用Spring 4。 问题答案: 你试过用这个吗

  • 我们有一个现有的Spring MVC应用程序(非Spring-boot应用程序),其中所有(或大部分)bean都是在XML中配置的。我们希望将其用作Spring Cloud配置客户机(我们有一个Spring Boot应用程序作为配置服务器)。 在这方面,在XML中用刷新范围配置bean(与@refreshScope注释相同)的XML等效性是什么。尝试将RefreshScope配置为bean,并使用

  • 我创建了一个示例--SPRING,JPA(EclipseLink持久性提供程序)和JTA事务管理器(JBoss7)。我观察到数据库中的所有数据都正确地显示在UI中以进行读操作。但是当涉及保存/更新或删除操作时,服务层不将工作提交到数据库。没有捕获到异常(我也检查了控制台/日志,并且调试了代码,可以看到EntityManager.persist/remove被调用,没有任何异常)。 > module

  • 我正在开发一个Spring靴应用程序。 我在为JBoss建立一个战争文件 我的战争正在正确构建,我使用*-war.原版作为JBoss的部署,部署似乎很好 但是当我给控制器打电话时,它会抛出一个带有嵌入式服务器的404,它工作正常。 砰.xml SpringBootServletInitializer 部署日志 WEB-INF/jboss-WEB.xml网站 类似于Wildfly和springboo

  • 我想将我的axis2项目与spring集成在一起。我按照本指南加载了一个spring applicationContext。 https://axis.apache.org/axis2/java/core/docs/spring.html 简而言之 以下是我的axis2版本服务: 问题:当轴调用 getResponse() 方法时,dao 设法获取注入的会话工厂(和Hibernate会话),但是当

  • 问题内容: 我编写了以下.NET Framework 3.5 C#方法,该方法获取XML文档的位置和X509数字证书(带有私钥)的对象表示形式,并将XML文档作为嵌入了XML签名(XMLDsig)的对象返回作为根的第一个子元素。 事实是,我迫切需要能够使用Java SE 6执行完全相同的过程,但是我很久没有写过任何Java了,也不知道从哪里开始。 谁能在Java代码中提供产生 完全相同的 XML输