I am having a problem where calling
refresh() throws an
java.lang.IllegalArgumentException: Entity not managed, but replacing it with
merge() in the same code works. I am not sure if this is a bug or if it has something to do with how the code is set up. I am calling refresh through a template style anonymous innner class that accepts the entity as a final class. Here is a code excerpt
Code:
public <T> void refresh(final T entity) {
log.tracef("Refreshing entity %s", entity);
executeQuery(new IHibernateQuery<T>() {
public T execute(EntityManager entityManager) {
entityManager.refresh(entity);
return null;
}
});
}
public <T> T merge(final T entity) {
log.tracef("Merging entity %s", entity);
return executeQuery(new IHibernateQuery<T>() {
public T execute(EntityManager entityManager) {
return entityManager.merge(entity);
}
});
}
This code gets executed in this block
Code:
public <T> T executeQuery(IHibernateQuery<T> query) {
EntityManager em;
T results;
//get the entity manager
em = getEntityManager();
try {
log.trace("Joining transaction");
em.joinTransaction();
log.trace("Executing query");
results = query.execute(em);
log.trace("Have results, committing");
em.commitTransaction();
return results;
} catch (RuntimeException runtimeEx) {
em.rollbackActiveTransaction();
throw runtimeEx;
} catch (Error error) {
em.rollbackActiveTransaction();
throw error;
} finally {
if (em.isOpen()) {
log.trace("Closing entity manager");
em.close();
}
}
}
Here is the relevant stack trace
Code:
java.lang.IllegalArgumentException: Entity not managed
at org.hibernate.ejb.AbstractEntityManagerImpl.refresh(AbstractEntityManagerImpl.java:260)
The code throwing the exception is this
Code:
AbstractEntityManagerImpl...
public void refresh(Object entity) {
checkTransactionNeeded();
//adjustFlushMode();
try {
259: if ( ! getSession().contains( entity ) ) {
260: throw new IllegalArgumentException( "Entity not managed" );
}
getSession().refresh( entity );
}
catch (MappingException e) {
throw new IllegalArgumentException( e.getMessage(), e );
}
catch (HibernateException he) {
throwPersistenceException( he );
}
}
Based on this code, it doesn't look like refresh is hitting the database at all.
Log excerpt
Code:
[15:15:04.555] [TRACE] [AbstractDataAccessor] - Joining transaction
[15:15:04.555] [DEBUG] [SessionImpl] - opened session at timestamp: 4803751545057284
[15:15:04.555] [DEBUG] [JDBCTransaction] - begin
[15:15:04.555] [DEBUG] [ConnectionManager] - opening JDBC connection
[15:15:04.555] [DEBUG] [JDBCTransaction] - current autocommit status: true
[15:15:04.555] [DEBUG] [JDBCTransaction] - disabling autocommit
[15:15:04.555] [DEBUG] [JDBCContext] - after transaction begin
[15:15:04.555] [TRACE] [AbstractDataAccessor] - Executing business transaction
[15:15:04.555] [TRACE] [MemberManager] - Refreshing <MemberType id="124" name="Test Type" displayName="Test Type" description="The test member type"/>
[15:15:04.570] [TRACE] [AbstractDataAccessor] - Refreshing entity <MemberType id="124" name="Test Type" displayName="Test Type" description="The test member type"/>
[15:15:04.570] [TRACE] [AbstractDataAccessor] - Joining transaction
[15:15:04.570] [TRACE] [AbstractDataAccessor] - Executing query
[15:15:04.570] [DEBUG] [JDBCTransaction] - rollback
[15:15:04.570] [DEBUG] [JDBCTransaction] - re-enabling autocommit
[15:15:04.570] [DEBUG] [JDBCTransaction] - rolled back JDBC Connection
[15:15:04.586] [DEBUG] [JDBCContext] - after transaction completion
[15:15:04.586] [DEBUG] [ConnectionManager] - aggressively releasing JDBC connection
[15:15:04.586] [DEBUG] [ConnectionManager] - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
[15:15:04.586] [DEBUG] [SessionImpl] - after transaction completion
[15:15:04.586] [TRACE] [AbstractDataAccessor] - Closing entity manager
[15:15:04.586] [TRACE] [AbstractDataAccessor] - Closing entity manager
[15:15:04.586] [ERROR] [MemberManagerTest] - Error occurred inserting attribute
java.lang.IllegalArgumentException: Entity not managed
at org.hibernate.ejb.AbstractEntityManagerImpl.refresh(AbstractEntityManagerImpl.java:260)