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 楼答案
如果您使用的是容器管理的事务(看起来是这样),则没有理由注入UserTransaction对象或使用entityManager#getTransaction()方法。您应该只在CDI@Transactional注释方法或EJB@TransactionaAttribute注释方法内执行该方法
简而言之:您只需要删除saveReportToDB方法中的事务调用,让CDI或EJB事务控制为您解决问题
如果确实需要控制事务,则必须对bean进行注释,以便事务控制由bean控制(而不是容器控制),这样您就能够使用注入的UserTransaction