如何使用JTA插入表格?

问题描述

我想将数据持久保存到表中。当我调用save方法时,它将引发异常:“ EXCEPTION 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;

解决方法

如果您使用的是容器管理的事务(如实际情况),则没有理由注入UserTransaction对象或使用EntityManager#getTransaction()方法。您只应在带有CDI @Transactional注释的方法或带有EJB @TransactionAttribute注释的方法内执行该方法。

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

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