-1

我无法在没有事务的情况下将我的实体数据保存到数据库中。我知道 PersistenceContextType.Extend,但我无法成功。


@NoTransaction
public class Application extends Controller {

    public static void create(String body) {
        // EntityTransaction tm = JPA.em().getTransaction();
        if (!JPA.isEnabled()) {
            System.out.println("JPA is not initialized");
        }
        EntityManager manager = JPA.entityManagerFactory.createEntityManager();
        //manager.setFlushMode(FlushModeType.COMMIT);
        manager.setProperty("org.hibernate.readOnly", false);
        //new Customer("001").save();
        if (!JPA.isInsideTransaction()) {
        //  manager.getTransaction().begin();
        }
        createContext(manager, false);
        new Customer("001").save();
        //manager.getTransaction().commit();
        /*
         * if (tm.equals(null)) { System.out.println("success"); }
         */
    }

    static void createContext(EntityManager entityManager, boolean readonly) {
        if (JPA.local.get() != null) {
            try {
                JPA.local.get().entityManager.close();
            } catch (Exception e) {
                // Let's it fail
            }
            JPA.local.remove();
        }
        JPA context = new JPA();
        context.entityManager = entityManager;
        // context.readonly = readonly;
        JPA.local.set(context);
    }
}

我自己初始化了 JPA 以防止 play 开始交易。我想将数据保存到数据库中,但出现 TransactionRequiredException 错误。我知道JPA操作需要一个事务,但我想知道是否有异常。

4

1 回答 1

0

我不太确定你想在这里实现什么。最好让 Play 处理交易。如果没有事务,您将无法提交更改。

如果您需要更多控制何时提交事务,您可以使用如下实用方法:

public static void commit() {
    if (JPA.em().getTransaction().getRollbackOnly()) {
        JPA.em().getTransaction().rollback();
    } else {
        JPA.em().getTransaction().commit();
    }
    JPA.em().getTransaction().begin();
    JPA.em().flush();
    JPA.em().clear();
}
于 2013-10-27T06:18:38.833 回答