Indeed, it does :(
Tracing code in ManagedEntityIdentityInterceptor:
private static final Log log = LogFactory.getLog(ManagedEntityIdentityInterceptor.class);
private void getFromWrapper(Object bean, Field field, Object dataModel)
throws Exception {
Object value = Contexts.getConversationContext().get(getFieldId(field));
if (value != null) {
if (dataModel == null) {
if (field.getName().equals("resultList"))
log.warn("getFromWrapper: "
+ bean.getClass().getSimpleName() + "."
+ field.getName() + " = " + value);
Reflections.set(field, bean, value);
} else {
setWrappedData(dataModel, value);
}
}
}
private void saveWrapper(Object bean, Field field, Object dataModel,
Object value) throws Exception {
if (field.getName().equals("resultList"))
log.warn("saveWrapper: conversation." + getFieldId(field) + " = "
+ value);
Contexts.getConversationContext().set(getFieldId(field), value);
if (dataModel == null) {
if (field.getName().equals("resultList"))
log.warn("saveWrapper: " + bean.getClass().getSimpleName()
+ "." + field.getName() + " = null");
Reflections.set(field, bean, null);
} else {
setWrappedData(dataModel, null);
}
}
Tracing in EntityQuery:
private void initResultList() {
if (getEjbql() != null && getEjbql().startsWith("FROM Account")) {
log.warn("Entered initResultList: hashcode " + this.hashCode()
+ ", list = " + resultList);
}
if (resultList == null) {
javax.persistence.Query query = createQuery();
resultList = query == null ? null : query.getResultList();
}
if (getEjbql() != null && getEjbql().startsWith("FROM Account")) {
log.warn("Exited initResultList: hashcode " + this.hashCode()
+ ", list = " + resultList);
}
}
@Transactional
@Override
public List getResultList() {
if (getEjbql() != null && getEjbql().startsWith("FROM Account")) {
log.warn("Entered getResultList: hashcode " + this.hashCode()
+ ", list = " + resultList);
}
if (isAnyParameterDirty()) {
refresh();
}
initResultList();
try {
return truncResultList(resultList);
} finally {
if (getEjbql() != null && getEjbql().startsWith("FROM Account")) {
log.warn("Exited getResultList: hashcode " + this.hashCode()
+ ", list = " + resultList);
}
}
}
@Override
public void refresh() {
if (getEjbql() != null && getEjbql().startsWith("FROM Account")) {
log.warn("Entered refresh: hashcode " + this.hashCode()
+ ", list = " + resultList);
}
super.refresh();
resultCount = null;
resultList = null;
singleResult = null;
if (getEjbql() != null && getEjbql().startsWith("FROM Account")) {
log.warn("Exited refresh: hashcode " + this.hashCode()
+ ", list = " + resultList);
}
}
Tracing in AccountController (my code):
@Transactional
public void save() {
log.warn("save: before persist");
em.persist(selectedAccount);
log.warn("save: before flush");
em.flush();
selectedAccount = null;
log.warn("save: before refresh");
userAccounts.refresh();
log.warn("save: after refresh");
}
Log output on new record insert (resultList is supposed to go from one item to two):
WARN [com.tdam.ptss.controller.AccountController] - save: before persist
Hibernate: select SEQ_ACCOUNT.nextval from dual
WARN [com.tdam.ptss.controller.AccountController] - save: before flush
Hibernate: insert into Account (CREATED_BY, CREATED_ON, MODIFIED_BY, MODIFIED_ON, ACCOUNT_NUMBER, closed, DEALER_NAME, discretionary, FAMILY_EXEMPTION, NAME_ON_STATEMENT, USER_ID, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
WARN [com.tdam.ptss.controller.AccountController] - save: before refresh
WARN [org.jboss.seam.persistence.ManagedEntityIdentityInterceptor] - getFromWrapper: EntityQuery.resultList = [Account[87]]
WARN [org.jboss.seam.framework.EntityQuery] - Entered refresh: hashcode 27469166, list = [Account[87]]
WARN [org.jboss.seam.framework.EntityQuery] - Exited refresh: hashcode 27469166, list = null
WARN [com.tdam.ptss.controller.AccountController] - save: after refresh
WARN [org.jboss.seam.persistence.ManagedEntityIdentityInterceptor] - getFromWrapper: EntityQuery.resultList = [Account[87]]
WARN [org.jboss.seam.framework.EntityQuery] - Entered getResultList: hashcode 27469166, list = [Account[87]]
WARN [org.jboss.seam.framework.EntityQuery] - Entered initResultList: hashcode 27469166, list = [Account[87]]
WARN [org.jboss.seam.framework.EntityQuery] - Exited initResultList: hashcode 27469166, list = [Account[87]]
WARN [org.jboss.seam.framework.EntityQuery] - Exited getResultList: hashcode 27469166, list = [Account[87]]
WARN [org.jboss.seam.persistence.ManagedEntityIdentityInterceptor] - saveWrapper: conversation.userAccounts.resultList = [Account[87]]
WARN [org.jboss.seam.persistence.ManagedEntityIdentityInterceptor] - saveWrapper: EntityQuery.resultList = null
WARN [org.jboss.seam.persistence.ManagedEntityIdentityInterceptor] - getFromWrapper: EntityQuery.resultList = [Account[87]]
WARN [org.jboss.seam.framework.EntityQuery] - Entered getResultList: hashcode 27469166, list = [Account[87]]
WARN [org.jboss.seam.framework.EntityQuery] - Entered initResultList: hashcode 27469166, list = [Account[87]]
WARN [org.jboss.seam.framework.EntityQuery] - Exited initResultList: hashcode 27469166, list = [Account[87]]
WARN [org.jboss.seam.framework.EntityQuery] - Exited getResultList: hashcode 27469166, list = [Account[87]]
WARN [org.jboss.seam.persistence.ManagedEntityIdentityInterceptor] - saveWrapper: conversation.userAccounts.resultList = [Account[87]]
WARN [org.jboss.seam.persistence.ManagedEntityIdentityInterceptor] - saveWrapper: EntityQuery.resultList = null
Indeed, it does gets reset to old value right after I try to set it to null, and, as it uses reflection, it's no wonder why debugger wasn't catching it :(.
Now, is that considered to be the normal behavior (in which case - are there any ways to disable this interception?), or is this a bug (in which case I'll submit it to JIRA)?
Thanks,
Alex