Разве несколько транзакций не должны согласовываться с em.getTransaction ()?

Когда я выполняю:

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  int getNo(final Class entityClass) {
    final CriteriaBuilder qb = em.getCriteriaBuilder();
    final CriteriaQuery 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 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) 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 (..), находит зафиксированные изменения, но не запрос критериев.

7
задан xagyg 16 April 2013 в 13:02
поделиться