Когда я выполняю:
public void beginTransaction() {
em.getTransaction().begin();
}
после активной транзакции, запущенной таким же образом, я получаю следующее исключение:
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)
Базовая СУБД является встроенным Apache Derby, который длямои знания не поддерживают множественные соединения из разных JVMS, но в остальном поддерживают параллельные транзакции. Документация
Этот тестовый код не проходит:
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, но затем, когда я прихожу выполнить метод getNo (), используя тот же em, он не находит того, что было зафиксировано предыдущим.Я не вижу, в чем проблема.Очевидно, что существует проблема, поскольку «локальный» код, такой как em.find (..), находит зафиксированные изменения, но не запрос критерия.