Транзакция прервана - PullRequest
       2

Транзакция прервана

0 голосов
/ 09 декабря 2011

мой код такой ..

@PersistenceContext(unitName = "myPU")
private EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void registerManufactuerer(Manufacturer manufacturer) throws Exception {
    if (manufacturer.getId() != null) {
        for (Product product : manufacturer.getProducts()) {
            em.persist(product);
            em.remove(product);
        }
        em.persist(manufacturer);
        throw new Exception("Successfully registered");
    } else {
        throw new Exception("Registration is not possible");
    }
}

когда я запускаю проект, я получаю исключение ... то есть ...

Caused by: javax.transaction.RollbackException: Transaction marked for rollback.
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:473)
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:852)
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5114)
... 63 more
Caused by: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: com.model.Product[ id=1 ].
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.discoverUnregisteredNewObjects(RepeatableWriteUnitOfWork.java:302)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.calculateChanges(UnitOfWorkImpl.java:695)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1482)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.issueSQLbeforeCompletion(UnitOfWorkImpl.java:3135)
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.issueSQLbeforeCompletion(RepeatableWriteUnitOfWork.java:344)
    at org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:157)
    at org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68)
    at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:435)
    ... 65 more

на самом деле ... чтопричина?

1 Ответ

2 голосов
/ 09 декабря 2011

Причина в том, что сообщение об ошибке говорит вам:

Во время синхронизации был обнаружен новый объект через связь, которая не была помечена каскадом1004 *

Ваш продукт ссылается на другую сущность, которая еще не была сохранена, и отношение не определяет постоянный каскад.Таким образом, идентификатор этой новой сущности не найден в базе данных, и, следовательно, ваш продукт еще не может быть сохранен.

Скорее всего, это производитель, поэтому сначала сохраните производителя.

Кстати, почему вы сначала сохраняете продукт и сразу его удаляете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...