gpt4 book ai didi

java - 多个事务不是应该与 em.getTransaction() 一致吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:24:04 26 4
gpt4 key购买 nike

当我执行时:

public void beginTransaction() {
em.getTransaction().begin();
}

在以相同方式启动一个 Activity 事务后,我得到以下异常:

Exception Description: Transaction is currently active
java.lang.IllegalStateException:
Exception Description: Transaction is currently active
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.begin(EntityTransactionImpl.java:45)
at com.mysimpatico.memoplatform.persistence.Database.beginTransaction(Database.java:44)
at com.mysimpatico.memoplatform.persistence.tests.PersistenceTest.setUp(PersistenceTest.java:39)

底层 DBMS 是嵌入式 apache derby,据我所知,它不支持来自不同 JVMS 的多个连接,但支持并发事务。 Documentation

此测试代码失败:

public <Entity> int getNo(final Class<Entity> entityClass) {
final CriteriaBuilder qb = em.getCriteriaBuilder();
final CriteriaQuery<Long> cq = qb.createQuery(Long.class);
cq.select(qb.count(cq.from(entityClass)));
final int ret = em.createQuery(cq).getSingleResult().intValue();
return ret;
}

protected void insertWords(final List<String[]> expressionDefTriples, MUser usr, final MeaningsDatabase mengsDB) throws Exception {
for (String[] expressionDefTriple : expressionDefTriples) {
mengsDB.persistSynonyms(MeaningsDatabase.toEnumMap(expressionDefTriple, usr));
testSynonymsPersistance(expressionDefTriple,mengsDB);
}
}

protected void testSynonymsPersistance(final String[] expDefTriple, final MeaningsDatabase mengsDB) {
final Expression exp = mengsDB.get(Expression.class, expDefTriple[0]);
testGender(exp, expDefTriple[2]);
final Expression def = mengsDB.get(Expression.class, expDefTriple[1]);
assertNotNull(def);
assertTrue(exp.getMengs().size() > 0);
assertTrue(def.getMengs().size() > 0);
assertTrue(mengsDB.getNo(Meaning.class) > 0); //fails here
}

public void persistSynonyms(final EnumMap<Input, MemoEntity> input) throws MultipleMengsException {
final Expression def = extractExp(input, Input.definition);
final Expression exp = extractExp(input, Input.expression);
final MUser usr = extractUsr(input);

beginTransaction();
final Meaning meng = persistMeng(exp, usr, def);
commitTransaction();
signalContentAvailability();
logInsertion(meng, exp, def);
}

本质上,我在同一个 em 中启动并提交了一个事务,但是当我开始使用同一个 em 执行 getNo() 方法时,它没有找到之前提交的内容。我看不出问题出在哪里。显然存在问题,因为像 em.find(..) 这样的“本地”代码找到了已提交的更改,但没有找到条件查询。

最佳答案

EntityManager#getTransaction()实际上返回当前resource local transaction 你不能调用 EntityTransaction#begin()当交易已经激活时:

/**
* Start a resource transaction.
* @throws IllegalStateException if isActive() is true
*/
public void begin();

您可以按照 EntityManager#getTransaction() 的 javadoc 中的提示创建串行本地事务:

/**
* Return the resource-level <code>EntityTransaction</code> object.
* The <code>EntityTransaction</code> instance may be used serially to
* begin and commit multiple transactions.
* @return EntityTransaction instance
* @throws IllegalStateException if invoked on a JTA
* entity manager
*/
public EntityTransaction getTransaction();

总而言之,JPA(和 JTA)不支持 nested transactions .

引用资料

关于java - 多个事务不是应该与 em.getTransaction() 一致吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4002596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com