看起来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);
}
您没有正确处理事务管理。将您的事务管理器bean替换为:
@Bean
public PlatformTransactionManager transactionManager() {
final JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory());
return txManager;
}
当我们在持久方法上没有@transactional时,通常会发生这种行为。
因此,在如下方法的顶部添加事务性
@Override
@Transactional
public void createAccount(Account account) throws UsernameAlreadyInUseException {
entityManager.persist(account);
}
嗨,混淆是由于使用注释来配置事务管理器而不是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输