Ошибка во время сброса JPA - обнаружен неуправляемый объект в состоянии жизненного цикла, неуправляемый во время каскадного сохранения - PullRequest
0 голосов
/ 16 ноября 2018

Я использую Open JPA 2.4.2 на платформе OSGI с Apache Aries JPA 2.6.1 Мой DAO вводится с использованием Apache Aries Blueprint.

blueprint.xml

<blueprint default-activation="lazy"
xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jpa="http://aries.apache.org/xmlns/jpa/v2.0.0" xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0"
xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs" xmlns:cxf="http://cxf.apache.org/blueprint/core">

<jpa:enable />

<bean id="appDAO"
class="com.test.MyDAOImpl">
    <tx:transaction method="*" value="Required" />
</bean>
</blueprint>

В MyDAOImpl добавлен EntityManager с использованием аннотаций

public class MyDAOImpl implements MyDAO {

@PersistentContext(unitName = "test-unit")
private EntityManager entityManager;

public EntityObj getEntityObj(int id) {
    return entityManager.find(EntityObj.class, id);
}

public void saveParentObj(ParentOfEntity parentOfEntity) {
    entityManager.persist(parentOfEntity);
    entityManager.flush();
}
}

MyServiceImpl.java

private MyDAO myDAO;

public void updateEntityObj(int id) {
    ParentOfEntity parent = new ParentOfEntity();
    EntityObj obj = myDAO.getEntityObj(id);
    obj.setValue1("1");
    obj.setValue2("2");
    parent.setChild(obj);
    myDAO.saveParentObj(parent);
}

ParentOfEntity.java

class ParentOfEntity {
    private EntityObj child;
    ...
}

Это вызывает исключение

org.apache.openjpa.persistence.InvalidStateException: Encountered unmanaged 
object "com.test.EntityObj-15389840" in life cycle state  unmanaged while 
cascading persistence via field "com.test.ParentOfEntity.child" during 
flush.  However, this field does not allow cascade persist. You cannot flush 
unmanaged objects or graphs that have persistent associations to unmanaged 
objects.
Suggested actions: a) Set the cascade attribute for this field to 
CascadeType.PERSIST or CascadeType.ALL (JPA annotations) or "persist" or 
"all" (JPA orm.xml), 
b) enable cascade-persist globally, 
c) manually persist the related field value prior to flushing. 
d) if the reference belongs to another context, allow reference to it by 
setting StoreContext.setAllowReferenceToSiblingContext().

Если я снова получу дочерний объект EntityObj в методе saveParentObj MyDAO, то он пройдет успешно. Но это не нужно, поскольку у меня уже есть ссылка на entityObj, которая также была обновлена.

Можете ли вы посоветовать любое другое решение для того же?

...