有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用JTA插入到表中?

我想将数据持久化到表中。当我调用save方法时,它抛出一个异常:“异常saveToDB--java.lang.IllegalStateException:在启用符合JPA的事务访问的情况下使用JTA时,无法访问事务

我尝试使用以下代码片段修复此问题,但未成功:

@Resource
private UserTransaction transaction;
public method() {
  try {
     transaction.begin();
     ...do some persistence...
     transaction.commit();
  } catch (Exception e) {
     transaction.rollback();
  }
}

如何在持久化实体时避免给定的异常

这是我的保存方法:

private void saveReportToDB(String id, String name, String data,String mode) {
        try {
            logger.info("--- START saveToDB ---");

            entityManager.getTransaction().begin();
            Template report = new Template();
            report.setId(id);
            report.setName(name);
            report.setStatus(ReportStatus.ACTIVE);
            report.setTemplateContent(data);//throws Exception
            report.setTemplateDscx(name);
            report.setTplCode(mode);
            report.setCommitId(id);

            entityManager.persist(report);
            entityManager.getTransaction().commit();

        }catch (Exception ex){
            logger.info("--- EXEPTON saveToDB ---"+ex);
        }

    }

这是我的实体(部分):

@Entity
@Table(name = "TEMPLATES")
public class Template {
    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    private String id;
    @Column(name = "name", length = 128)
    private String name;
    @Column(name = "code", length = 24, unique = true)
    private String code;
    @Lob
    @Column(name = "content")
    private String content;

    @Column(name = "dscx")
    private String dscx;

共 (1) 个答案

  1. # 1 楼答案

    如果您使用的是容器管理的事务(看起来是这样),则没有理由注入UserTransaction对象或使用entityManager#getTransaction()方法。您应该只在CDI@Transactional注释方法或EJB@TransactionaAttribute注释方法内执行该方法

    简而言之:您只需要删除saveReportToDB方法中的事务调用,让CDI或EJB事务控制为您解决问题

    如果确实需要控制事务,则必须对bean进行注释,以便事务控制由bean控制(而不是容器控制),这样您就能够使用注入的UserTransaction