如何使用JTA控制JPA上的多个persist()调用事务?

时间:2016-04-25 12:27:30

标签: java jpa transactions eclipselink jta

我有多个彼此相关的表,如果在一步操作的persist()中发生错误,我想回滚所有记录。

我已经阅读了一些关于JTA的问题是应用程序控制和一些UserTranscation的例子。

我是JPA的新人,我只知道我必须做什么。

我需要将一些信息添加到Table1的记录并获取此recordId并将其用于Table2,其中包含一些信息和INSERT.If错误发生时将记录添加到第二个表我想回滚整个操作。但是,它会抛出异常在em.getTransaction().begin();,它说Exception Description: Cannot use an EntityTransaction while using JTA.

我应该使用UserTranscation还是我该怎么办这个类型的多个persist()?

@Dependent
@Transactional
public class UserService extends AbstractService<UserDO> {

@PersistenceContext(unitName = "UserProjectPU")
private EntityManager em;

@Inject
private UserFooService userFooService;

public UserService() {
    super(UserDO.class);
}

@Override
protected EntityManager getEntityManager() {
    return em;
}

public long addUser(UserDO user, String userAnotherInfo) {
    try {

        em.getTransaction().begin();

        UserDO usr = user;
        em.persist(user);
        em.flush();

        long addedUserId = usr.getId();

        UserFooDO userFoo= new UserFooDO();
        userFoo.setContent(userAnotherInfo);
        userFoo.setUserId(addedUserId);
        userFooService.create(userFoo);

        em.getTransaction().commit();

        return addedUserId;
    } catch (Exception ex) {
        em.getTransaction().rollback();
        throw new RuntimeException(ex);
    }
}

0 个答案:

没有答案