Object disappear
phantom Oct 31, 2007 7:57 AMGood day,
Let me show you a real magic! But I don't know the secret... If you know it - please describe me! It's real problem for me...
1 Class:
package xxx.finders; import org.jboss.seam.framework.EntityController; import org.jboss.seam.log.Log; import org.jboss.seam.annotations.Logger; import org.jboss.seam.annotations.Transactional; import xxx.Lecture; import java.util.List; import java.util.ArrayList; public class AbstractFinder<K> { private String query; private List<K> result; public final String getQuery() { return query; } public final void setQuery(String query) { this.query = query; } @Transactional public void search() { System.out.println("start search. This:"+this); this.result = searchResult(); System.out.println("Cal result: "+result+" This:"+this); } @Transactional protected List<K> searchResult() { return new ArrayList<K>(); } @Transactional public final List<K> getResult() { System.out.println("Start getResult. this:"+this); if(result==null) { System.out.println("searching"+this); search(); System.out.println("Cal result: "+result+" This:"+this); } System.out.println("result: "+result+"this:"+this); return result; } }
2 class
package xxx.finders; import xxx.testtree.Test; import java.util.List; import java.util.ArrayList; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Logger; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Scope; import org.jboss.seam.log.Log; import org.jboss.seam.ScopeType; import javax.persistence.EntityManager; @Name("testFinder") public class TestFinder extends AbstractFinder<Test> { @In private EntityManager entityManager; @Logger private Log log; protected List<Test> searchResult() { log.info("Invoked!!!"); String query = getQuery(); if(query==null || query.equals("")) { List<Test> tests = (List<Test>)entityManager.createQuery("select object(t) from Test t order by t.title").getResultList(); log.info("Tests: "+tests); return tests; } else { List<Test> ret = new ArrayList<Test>(); String sql = "select object(t) from Test t where t.title like :query order by t.title"; ret.addAll(entityManager.createQuery(sql).setParameter("query", "%"+query+"%").getResultList()); sql = "select object(t) from Test t, Domain d where t.domain=d and d.title like :query order by t.title"; ret.addAll(entityManager.createQuery(sql).setParameter("query", "%"+query+"%").getResultList()); return ret; } } }
Now the magic!
Externaly from JSF page I'm trying to get result property from 'testfinder' bean. And there I recieve null! But look to the logs:
2007-10-31 14:43:09,921 INFO [STDOUT] start search. This:xxx.finders.TestFinder@f09d3d 2007-10-31 14:43:09,921 INFO [xxx.finders.TestFinder] Invoked!!! 2007-10-31 14:43:09,921 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to open PreparedStatement (open PreparedStatements: 0, globally: 0) 2007-10-31 14:43:09,921 DEBUG [org.hibernate.jdbc.ConnectionManager] opening JDBC connection 2007-10-31 14:43:09,921 DEBUG [org.hibernate.SQL] select test0_.test_id as test1_74_, test0_.title as title74_, test0_.content as content74_, test0_.author_id as author5_74_, test0_.domain_id as domain4_74_ from tests test0_ order by test0_.title 2007-10-31 14:43:09,921 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to open ResultSet (open ResultSets: 0, globally: 0) 2007-10-31 14:43:09,921 DEBUG [org.hibernate.loader.Loader] result row: EntityKey[xxx.testtree.Test#1] 2007-10-31 14:43:09,921 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to close ResultSet (open ResultSets: 1, globally: 1) 2007-10-31 14:43:09,921 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 2007-10-31 14:43:09,921 DEBUG [org.hibernate.jdbc.ConnectionManager] aggressively releasing JDBC connection 2007-10-31 14:43:09,921 DEBUG [org.hibernate.jdbc.ConnectionManager] releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)] 2007-10-31 14:43:09,921 DEBUG [org.hibernate.engine.StatefulPersistenceContext] initializing non-lazy collections 2007-10-31 14:43:09,921 INFO [xxx.finders.TestFinder] Tests: [xxx.testtree.Test@1] 2007-10-31 14:43:09,921 INFO [STDOUT] Cal result: [xxx.testtree.Test@1] This:xxx.finders.TestFinder@f09d3d 2007-10-31 14:43:09,921 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Looking for a JTA transaction to join 2007-10-31 14:43:09,921 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Transaction already joined 2007-10-31 14:43:09,921 INFO [STDOUT] Cal result: null This:xxx.finders.TestFinder@f09d3d 2007-10-31 14:43:09,921 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Looking for a JTA transaction to join 2007-10-31 14:43:09,921 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Transaction already joined 2007-10-31 14:43:09,921 INFO [STDOUT] result: nullthis:xxx.finders.TestFinder@f09d3d
Most interesting (the first and the last line):
2007-10-31 14:43:09,921 INFO [STDOUT] Cal result: [xxx.testtree.Test@1] This:xxx.finders.TestFinder@f09d3d 2007-10-31 14:43:09,921 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Looking for a JTA transaction to join 2007-10-31 14:43:09,921 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Transaction already joined 2007-10-31 14:43:09,921 INFO [STDOUT] Cal result: null This:xxx.finders.TestFinder@f09d3d
That's mean that object disapear somewhere between method invokation! But where and why???
Please, help me!