问题描述
我想将数据持久保存到表中。当我调用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。