TransactionRequiredException执行更新/删除查询

嗨我正在使用带有spring和mongodb的hibernate JPA,我在Glassfish-4.0上运行我的应用程序。

我的服务类是

@Component public class Test { @PersistenceContext EntityManager em; EntityManagerFactory emf; @Transactional public String persist(Details details){ details.getUsername(); details.getPassword(); Query query = em.createNativeQuery("db.details.find(username= "+details.getUsername()+"& password= "+details.getPassword()); em.getTransaction().begin(); em.persist(details); em.getTransaction().commit(); em.flush(); em.clear(); em.close(); query.executeUpdate(); System.out.println("Sucessful!"); return "persist"; } } 

还有我的spring-context.xml

                 

我在代码中应用了一些更改,但它们没有效果。 任何人都可以帮我解决这个问题。 提前致谢。

我不确定这是否会对你的情况有所帮助(即如果它仍然存在),但是,在网上搜索类似问题之后。

我正在从持久性实体管理器创建一个本机查询来执行更新。

 Query query = entitymanager.createNativeQuery(queryString); 

我收到以下错误:

由以下原因引起:javax.persistence.TransactionRequiredException:执行更新/删除查询

许多解决方案建议在您的方法中添加@Transactional。 这样做并没有改变错误。

有些解决方案建议向实体管理员询问EntityTransaction,以便您可以自己调用begin和commit。 这引发了另一个错误:

由以下原因引起:java.lang.IllegalStateException:不允许在共享的EntityManager上创建tranaction – 使用Spring事务或EJB CMT代替

然后我尝试了一种方法,大多数网站都说是使用应用程序管理的实体管理器而不是容器管理(我相信Spring是),那就是joinTransaction()

@Transactional装饰该方法,然后在调用joinTransation()之前调用EntityManager对象上的query.executeUpdate()并且我的本机查询更新工作。

我希望这可以帮助其他人遇到这个问题。

作为配置xml的forms,很明显你将使用基于spring的事务。 请确保您用于@Transactional的导入是“org.springframework.transaction.annotation.Transactional”

在你的情况下,它可能是“javax.transaction.Transactional”

干杯

Chetan Verma

在我的情况下,我导入了错误的@Transaction 。 正确的是:

 org.springframework.transaction.annotation.Transactional 

不是 javax.transaction.Transactional

当我使用Hibernate和Spring Jpa Data Repository时,我也遇到了同样的问题。 我忘了在Spring数据存储库方法上放置@Transactional

在使用@Transactional注释后,它为我工作。

如何将@Transactional从方法转移到类级别? 在类似的情况下为我工作,虽然我不是100%肯定为什么。

您无需担心开始和结束交易。 您已经应用了@Transactional注释,它在您的方法开始时在内部打开事务,在您的方法结束时结束。 因此,只需将此对象保存在数据库中即可。

  @Transactional(readOnly = false, isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class}) public String persist(Details details){ details.getUsername(); details.getPassword(); Query query = em.createNativeQuery("db.details.find(username= "+details.getUsername()+"& password= "+details.getPassword()); em.persist(details); System.out.println("Sucessful!"); return "persist"; } 

编辑:问题似乎与您的配置文件有关。 如果您使用的是JPA,则配置文件应具有以下配置

         

在我意识到我的方法被宣布为public final而不仅仅是public之前,似乎没有什么对我有用。 错误是由final关键字引起的。 删除它使错误消失。

我有同样的错误。

我刚刚在方法上添加了javax.transaction.Transactional@Transactional注释。

在我的项目中将Spring 4与Hibernate 5集成并遇到这个问题之后,我发现通过改变从sessionFactory.openSession()sessionFactory.getCurrentSession()的会话方式,我可以防止出现错误。 解决这个错误的正确方法可能是继续使用相同的会话来进行绑定事务。开始时,会始终创建一个新的会话,它不像前者那样持有一个事务configed.using getCurrentSession并添加其他属性org.springframework.orm.hibernate5.SpringSessionContext对我来说很好。

我遇到了同样的exception“ TransactionRequiredException执行更新/删除查询 ”,但对我来说,原因是我在spring applicationContext.xml文件中创建了另一个bean,其名称为“ transactionManager ”,引用了“ org.springframework.jms.connection”。 .JmsTransactionManage r“但是有另一个名为” transactionManager “的bean 引用org.springframework.orm.jpa.JpaTransactionManager “。 所以JPA bean被JMS bean夸大了。

重命名Jms的bean名称后,问题得以解决。

 import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @Transactional public int changepassword(String password, long mobile) { // TODO Auto-generated method stub session = factory.getCurrentSession(); Query query = session.createQuery("update User u set u.password='" + password + "' where u.mobile=" + mobile); int result = query.executeUpdate(); return result; } add this code 200% it will work... might scenario is diff but write like this:) 

尝试在Java SE中的非JTA(即资源本地)实体管理器中运行批量UPDATE查询时,我收到此exception。 我只是忘了把我的JPQL代码包装进去

 em.getTransaction().begin(); 

 em.getTransaction().commit();