【问题标题】:TransactionRequiredException when trying to insert data into database with Java尝试使用 Java 将数据插入数据库时​​出现 TransactionRequiredException
【发布时间】:2018-08-22 10:13:36
【问题描述】:

我正在尝试使用如下代码将数据插入数据库:

Query query=em.createNativeQuery("insert into tab1 (col1, col2) values ('val1', 'val2')");
int result=query.executeUpdate();

但它会引发 TransactionRequiredException。那是什么?

【问题讨论】:

  • 你需要一个事务......就像例外所说的那样!任何 JPA 文档都会告诉你如何拥有一个
  • 我也尝试用 entityManager.getTransaction().begin() 和 entityManager.getTransaction().commit() 包围我的代码,但我得到了另一个异常:java.lang.IllegalStateException : JTA EntityManager 不能使用 getTransaction()
  • 既然您没有定义您的persistence.xml,那么您希望人们告诉您JPA 文档不会告诉您什么? datanucleus.org:15080/products/accessplatform_5_2/jpa/…毕竟是你选择使用JTA事务,所以你必须知道如何使用它们

标签: java postgresql jpa


【解决方案1】:

异常是不言自明的,并且在堆栈溢出时已经给出了多种解决方案。

您需要在执行任何插入/更新/删除操作之前启动会话(事务)。 如果您使用的是spring,那么您可以使用@Transactional 属性,否则以编程方式创建/关闭事务。

请检查。 Transaction required exception JPA / Spring

【讨论】:

  • 我刚刚在我的方法上方插入了@Transactional(propagation = Propagation.REQUIRES_NEW),但它强调了事务性和传播性
  • 我也尝试用 entityManager.getTransaction().begin() 和 entityManager.getTransaction().commit() 包围我的代码,但我遇到了另一个异常:java.lang.IllegalStateException : JTA EntityManager 不能使用 getTransaction()
  • 你定义了 TransactionManager 吗?下划线是什么意思。您可以直接将其与默认传播类型一起使用,例如 @Transactional()
【解决方案2】:

我最终发现我的班级中有一个如下所示的属性:

@Resource
javax.transaction.UserTransaction userTransaction;

所以执行插入的正确方法是:

userTransaction.begin();
Query query=em.createNativeQuery("insert into tab1 (col1, col2) values ('val1', 'val2')");
int result=query.executeUpdate();
userTransaction.commit();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多