Re: Quick model/user/session question
Thanks James and Igor for looking it over. Switching the order of the filter definitions didn't make a difference. If it helps, here's what I'm doing: 1 - This is the UserInfo class. As far as this test case is concerned, it has an ID and a SetString to check lazy loading. I've commented out the FetchType.EAGER to test the OSIV. When it is uncommented, the UserPage (#2, below) renders correctly, otherwise I get a lazy load exception. @Entity @Table(name = zjp_user_accounts) public class UserInfo extends PersonInfo { @Id Long id; @OneToMany(mappedBy=employerInfo /*, fetch=FetchType.EAGER*/) SetString postedJobs; ... } 2 - UserPage is the page I'm using to test lazy loading. public class UserPage extends WebPage { @SpringBean(name = personInfoDao) private PersonInfoDao personInfoDao; public UserPage() { EntityModelPersonInfo personInfoModel = new EntityModelPersonInfo(UserInfo.class, new Long(1)); EmployerInfo personInfo = (EmployerInfo)personInfoModel.getObject(); SetString jobs = personInfo.getPostedJobs(); IteratorString itr = jobs.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); } } } 3 - And this is the EntityModel, based on the Smart EntityModel article - http://wicketinaction.com/2008/09/building-a-smart-entitymodel/ public class EntityModelT extends Identifiable? extends AbstractEntityModelT { @SpringBean(name = entityDao) private EntityDao dao; public EntityModel(Class clazz, Serializable id) { super(clazz, id); // This makes the class Spring-aware, so we can inject the DAOs, as above InjectorHolder.getInjector().inject(this); } @Override protected T load(Class clazz, Serializable id) { return (T)dao.get(clazz, (Long)id); }; } I'd be happy to supply more code (xml files, etc.) if it would be useful. I feel that this is about as simple a use case as I can create for the issue. Thanks again for all your help! Dane On Sat, Aug 29, 2009 at 7:41 AM, James Carman ja...@carmanconsulting.comwrote: Aren't they chained based on the order of the filter mapping definitions, not the order of the filter definitions? On Aug 29, 2009 12:40 AM, Igor Vaynberg igor.vaynb...@gmail.com wrote: filters are executed in the order they are defined, so put the osiv filter declaration before wicket. -igor On Thu, Aug 27, 2009 at 8:08 AM, Dane Lavertydanelave...@gmail.com wrote: Thanks for the sugges...
Re: Quick model/user/session question
doesnt look like your osiv is working. you can create a wicket quickstart project and attach it to a jira issue if you want someone to take a look at it. other then that you can use the debugger to see if osiv is actually being hit *before* the wicket filter. -igor On Mon, Aug 31, 2009 at 7:50 AM, Dane Lavertydanelave...@gmail.com wrote: Thanks James and Igor for looking it over. Switching the order of the filter definitions didn't make a difference. If it helps, here's what I'm doing: 1 - This is the UserInfo class. As far as this test case is concerned, it has an ID and a SetString to check lazy loading. I've commented out the FetchType.EAGER to test the OSIV. When it is uncommented, the UserPage (#2, below) renders correctly, otherwise I get a lazy load exception. @Entity @Table(name = zjp_user_accounts) public class UserInfo extends PersonInfo { �...@id Long id; �...@onetomany(mappedBy=employerInfo /*, fetch=FetchType.EAGER*/) SetString postedJobs; ... } 2 - UserPage is the page I'm using to test lazy loading. public class UserPage extends WebPage { �...@springbean(name = personInfoDao) private PersonInfoDao personInfoDao; public UserPage() { EntityModelPersonInfo personInfoModel = new EntityModelPersonInfo(UserInfo.class, new Long(1)); EmployerInfo personInfo = (EmployerInfo)personInfoModel.getObject(); SetString jobs = personInfo.getPostedJobs(); IteratorString itr = jobs.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); } } } 3 - And this is the EntityModel, based on the Smart EntityModel article - http://wicketinaction.com/2008/09/building-a-smart-entitymodel/ public class EntityModelT extends Identifiable? extends AbstractEntityModelT { �...@springbean(name = entityDao) private EntityDao dao; public EntityModel(Class clazz, Serializable id) { super(clazz, id); // This makes the class Spring-aware, so we can inject the DAOs, as above InjectorHolder.getInjector().inject(this); } �...@override protected T load(Class clazz, Serializable id) { return (T)dao.get(clazz, (Long)id); }; } I'd be happy to supply more code (xml files, etc.) if it would be useful. I feel that this is about as simple a use case as I can create for the issue. Thanks again for all your help! Dane On Sat, Aug 29, 2009 at 7:41 AM, James Carman ja...@carmanconsulting.comwrote: Aren't they chained based on the order of the filter mapping definitions, not the order of the filter definitions? On Aug 29, 2009 12:40 AM, Igor Vaynberg igor.vaynb...@gmail.com wrote: filters are executed in the order they are defined, so put the osiv filter declaration before wicket. -igor On Thu, Aug 27, 2009 at 8:08 AM, Dane Lavertydanelave...@gmail.com wrote: Thanks for the sugges... - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: Quick model/user/session question
Or, you can turn on spring logging to see it opening the session. On Mon, Aug 31, 2009 at 10:56 AM, Igor Vaynberg igor.vaynb...@gmail.comwrote: doesnt look like your osiv is working. you can create a wicket quickstart project and attach it to a jira issue if you want someone to take a look at it. other then that you can use the debugger to see if osiv is actually being hit *before* the wicket filter. -igor On Mon, Aug 31, 2009 at 7:50 AM, Dane Lavertydanelave...@gmail.com wrote: Thanks James and Igor for looking it over. Switching the order of the filter definitions didn't make a difference. If it helps, here's what I'm doing: 1 - This is the UserInfo class. As far as this test case is concerned, it has an ID and a SetString to check lazy loading. I've commented out the FetchType.EAGER to test the OSIV. When it is uncommented, the UserPage (#2, below) renders correctly, otherwise I get a lazy load exception. @Entity @Table(name = zjp_user_accounts) public class UserInfo extends PersonInfo { @Id Long id; @OneToMany(mappedBy=employerInfo /*, fetch=FetchType.EAGER*/) SetString postedJobs; ... } 2 - UserPage is the page I'm using to test lazy loading. public class UserPage extends WebPage { @SpringBean(name = personInfoDao) private PersonInfoDao personInfoDao; public UserPage() { EntityModelPersonInfo personInfoModel = new EntityModelPersonInfo(UserInfo.class, new Long(1)); EmployerInfo personInfo = (EmployerInfo)personInfoModel.getObject(); SetString jobs = personInfo.getPostedJobs(); IteratorString itr = jobs.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); } } } 3 - And this is the EntityModel, based on the Smart EntityModel article - http://wicketinaction.com/2008/09/building-a-smart-entitymodel/ public class EntityModelT extends Identifiable? extends AbstractEntityModelT { @SpringBean(name = entityDao) private EntityDao dao; public EntityModel(Class clazz, Serializable id) { super(clazz, id); // This makes the class Spring-aware, so we can inject the DAOs, as above InjectorHolder.getInjector().inject(this); } @Override protected T load(Class clazz, Serializable id) { return (T)dao.get(clazz, (Long)id); }; } I'd be happy to supply more code (xml files, etc.) if it would be useful. I feel that this is about as simple a use case as I can create for the issue. Thanks again for all your help! Dane On Sat, Aug 29, 2009 at 7:41 AM, James Carman ja...@carmanconsulting.comwrote: Aren't they chained based on the order of the filter mapping definitions, not the order of the filter definitions? On Aug 29, 2009 12:40 AM, Igor Vaynberg igor.vaynb...@gmail.com wrote: filters are executed in the order they are defined, so put the osiv filter declaration before wicket. -igor On Thu, Aug 27, 2009 at 8:08 AM, Dane Lavertydanelave...@gmail.com wrote: Thanks for the sugges... - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: Quick model/user/session question
Here's the output on startup. The OSIV is being loaded before the WicketFilter, and when I set breakpoints I can see that the OpenSessionInViewFilter is being hit first on each request. I'm turning the project into a QuickStart and will attach it to a JIRA issue. DEBUG main org.mortbay.log - loaded class org.springframework.orm.hibernate3.support.OpenSessionInViewFilter from sun.misc.launcher$appclassloa...@1a7bf11 DEBUG main org.mortbay.log - Holding class org.springframework.orm.hibernate3.support.OpenSessionInViewFilter DEBUG main org.springframework.orm.hibernate3.support.OpenSessionInViewFilter - Initializing filter 'open.hibernate.session.in.view' DEBUG main org.springframework.orm.hibernate3.support.OpenSessionInViewFilter - Filter 'open.hibernate.session.in.view' configured successfully DEBUG main org.mortbay.log - started open.hibernate.session.in.view DEBUG main org.mortbay.log - loaded class org.apache.wicket.protocol.http.WicketFilter from sun.misc.launcher$appclassloa...@1a7bf11 DEBUG main org.mortbay.log - Holding class org.apache.wicket.protocol.http.WicketFilter DEBUG main org.mortbay.log - loaded class org.apache.wicket.spring.SpringWebApplicationFactory from sun.misc.launcher$appclassloa...@1a7bf11 DEBUG main org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'wicketApplication' Dane On Mon, Aug 31, 2009 at 9:14 AM, James Carman jcar...@carmanconsulting.comwrote: Or, you can turn on spring logging to see it opening the session. On Mon, Aug 31, 2009 at 10:56 AM, Igor Vaynberg igor.vaynb...@gmail.com wrote: doesnt look like your osiv is working. you can create a wicket quickstart project and attach it to a jira issue if you want someone to take a look at it. other then that you can use the debugger to see if osiv is actually being hit *before* the wicket filter. -igor On Mon, Aug 31, 2009 at 7:50 AM, Dane Lavertydanelave...@gmail.com wrote: Thanks James and Igor for looking it over. Switching the order of the filter definitions didn't make a difference. If it helps, here's what I'm doing: 1 - This is the UserInfo class. As far as this test case is concerned, it has an ID and a SetString to check lazy loading. I've commented out the FetchType.EAGER to test the OSIV. When it is uncommented, the UserPage (#2, below) renders correctly, otherwise I get a lazy load exception. @Entity @Table(name = zjp_user_accounts) public class UserInfo extends PersonInfo { @Id Long id; @OneToMany(mappedBy=employerInfo /*, fetch=FetchType.EAGER*/) SetString postedJobs; ... } 2 - UserPage is the page I'm using to test lazy loading. public class UserPage extends WebPage { @SpringBean(name = personInfoDao) private PersonInfoDao personInfoDao; public UserPage() { EntityModelPersonInfo personInfoModel = new EntityModelPersonInfo(UserInfo.class, new Long(1)); EmployerInfo personInfo = (EmployerInfo)personInfoModel.getObject(); SetString jobs = personInfo.getPostedJobs(); IteratorString itr = jobs.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); } } } 3 - And this is the EntityModel, based on the Smart EntityModel article - http://wicketinaction.com/2008/09/building-a-smart-entitymodel/ public class EntityModelT extends Identifiable? extends AbstractEntityModelT { @SpringBean(name = entityDao) private EntityDao dao; public EntityModel(Class clazz, Serializable id) { super(clazz, id); // This makes the class Spring-aware, so we can inject the DAOs, as above InjectorHolder.getInjector().inject(this); } @Override protected T load(Class clazz, Serializable id) { return (T)dao.get(clazz, (Long)id); }; } I'd be happy to supply more code (xml files, etc.) if it would be useful. I feel that this is about as simple a use case as I can create for the issue. Thanks again for all your help! Dane On Sat, Aug 29, 2009 at 7:41 AM, James Carman ja...@carmanconsulting.comwrote: Aren't they chained based on the order of the filter mapping definitions, not the order of the filter definitions? On Aug 29, 2009 12:40 AM, Igor Vaynberg igor.vaynb...@gmail.com wrote: filters are executed in the order they are defined, so put the osiv filter declaration before wicket. -igor On Thu, Aug 27, 2009 at 8:08 AM, Dane Lavertydanelave...@gmail.com wrote: Thanks for the sugges... - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: Quick model/user/session question
You need the output from Spring classes during a request, not during application startup. On Mon, Aug 31, 2009 at 12:39 PM, Dane Laverty danelave...@gmail.comwrote: Here's the output on startup. The OSIV is being loaded before the WicketFilter, and when I set breakpoints I can see that the OpenSessionInViewFilter is being hit first on each request. I'm turning the project into a QuickStart and will attach it to a JIRA issue. DEBUG main org.mortbay.log - loaded class org.springframework.orm.hibernate3.support.OpenSessionInViewFilter from sun.misc.launcher$appclassloa...@1a7bf11 DEBUG main org.mortbay.log - Holding class org.springframework.orm.hibernate3.support.OpenSessionInViewFilter DEBUG main org.springframework.orm.hibernate3.support.OpenSessionInViewFilter - Initializing filter 'open.hibernate.session.in.view' DEBUG main org.springframework.orm.hibernate3.support.OpenSessionInViewFilter - Filter 'open.hibernate.session.in.view' configured successfully DEBUG main org.mortbay.log - started open.hibernate.session.in.view DEBUG main org.mortbay.log - loaded class org.apache.wicket.protocol.http.WicketFilter from sun.misc.launcher$appclassloa...@1a7bf11 DEBUG main org.mortbay.log - Holding class org.apache.wicket.protocol.http.WicketFilter DEBUG main org.mortbay.log - loaded class org.apache.wicket.spring.SpringWebApplicationFactory from sun.misc.launcher$appclassloa...@1a7bf11 DEBUG main org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'wicketApplication' Dane On Mon, Aug 31, 2009 at 9:14 AM, James Carman jcar...@carmanconsulting.comwrote: Or, you can turn on spring logging to see it opening the session. On Mon, Aug 31, 2009 at 10:56 AM, Igor Vaynberg igor.vaynb...@gmail.com wrote: doesnt look like your osiv is working. you can create a wicket quickstart project and attach it to a jira issue if you want someone to take a look at it. other then that you can use the debugger to see if osiv is actually being hit *before* the wicket filter. -igor On Mon, Aug 31, 2009 at 7:50 AM, Dane Lavertydanelave...@gmail.com wrote: Thanks James and Igor for looking it over. Switching the order of the filter definitions didn't make a difference. If it helps, here's what I'm doing: 1 - This is the UserInfo class. As far as this test case is concerned, it has an ID and a SetString to check lazy loading. I've commented out the FetchType.EAGER to test the OSIV. When it is uncommented, the UserPage (#2, below) renders correctly, otherwise I get a lazy load exception. @Entity @Table(name = zjp_user_accounts) public class UserInfo extends PersonInfo { @Id Long id; @OneToMany(mappedBy=employerInfo /*, fetch=FetchType.EAGER*/) SetString postedJobs; ... } 2 - UserPage is the page I'm using to test lazy loading. public class UserPage extends WebPage { @SpringBean(name = personInfoDao) private PersonInfoDao personInfoDao; public UserPage() { EntityModelPersonInfo personInfoModel = new EntityModelPersonInfo(UserInfo.class, new Long(1)); EmployerInfo personInfo = (EmployerInfo)personInfoModel.getObject(); SetString jobs = personInfo.getPostedJobs(); IteratorString itr = jobs.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); } } } 3 - And this is the EntityModel, based on the Smart EntityModel article - http://wicketinaction.com/2008/09/building-a-smart-entitymodel/ public class EntityModelT extends Identifiable? extends AbstractEntityModelT { @SpringBean(name = entityDao) private EntityDao dao; public EntityModel(Class clazz, Serializable id) { super(clazz, id); // This makes the class Spring-aware, so we can inject the DAOs, as above InjectorHolder.getInjector().inject(this); } @Override protected T load(Class clazz, Serializable id) { return (T)dao.get(clazz, (Long)id); }; } I'd be happy to supply more code (xml files, etc.) if it would be useful. I feel that this is about as simple a use case as I can create for the issue. Thanks again for all your help! Dane On Sat, Aug 29, 2009 at 7:41 AM, James Carman ja...@carmanconsulting.comwrote: Aren't they chained based on the order of the filter mapping definitions, not the order of the filter definitions? On Aug 29, 2009 12:40 AM, Igor Vaynberg igor.vaynb...@gmail.com wrote: filters are executed in the order they are defined, so put the osiv filter declaration before wicket. -igor On Thu, Aug 27, 2009 at 8:08 AM, Dane
Re: Quick model/user/session question
Here's my output on a request. I'm no expert on reading these, but it looks pretty clear to me that the OSIV filter (open.hibernate.session.in.view) is being hit before the Wicket filter (wicket.careerconnect). DEBUG btpool0-4 - /view-jobs org.mortbay.log - Got Session ID ofm3l3dawnb1 from cookie ... // Here's the call to OSIV filter DEBUG btpool0-4 - /view-jobs org.mortbay.log - call filter open.hibernate.session.in.view DEBUG btpool0-4 - /view-jobs org.springframework.orm.hibernate3.support.OpenSessionInViewFilter - Using SessionFactory 'sessionFactory' for OpenSessionInViewFilter DEBUG btpool0-4 - /view-jobs org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'sessionFactory' DEBUG btpool0-4 - /view-jobs org.springframework.orm.hibernate3.support.OpenSessionInViewFilter - Opening single Hibernate Session in OpenSessionInViewFilter DEBUG btpool0-4 - /view-jobs org.springframework.orm.hibernate3.SessionFactoryUtils - Opening Hibernate Session DEBUG btpool0-4 - /view-jobs org.hibernate.impl.SessionImpl - opened session at timestamp: 5127121449623552 ... // Here's the call to Wicket Filter DEBUG btpool0-4 - /view-jobs org.mortbay.log - call filter wicket.careerconnect DEBUG btpool0-4 - /view-jobs org.springframework.transaction.support.TransactionSynchronizationManager - Retrieved value [org.springframework.orm.hibernate3.sessionhol...@835551] for key [org.hibernate.impl.sessionfactoryi...@11739d] bound to thread [btpool0-4 - /view-jobs] DEBUG btpool0-4 - /view-jobs org.springframework.orm.hibernate3.HibernateTransactionManager - Found thread-bound Session [org.hibernate.impl.sessioni...@14af2c1] for Hibernate transaction DEBUG btpool0-4 - /view-jobs org.springframework.orm.hibernate3.HibernateTransactionManager - Using transaction object [org.springframework.orm.hibernate3.hibernatetransactionmanager$hibernatetransactionobj...@18762b1 ] ... DEBUG btpool0-4 - /view-jobs org.springframework.orm.hibernate3.HibernateTransactionManager - Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.sessioni...@14af2c1 ] TRACE btpool0-4 - /view-jobs org.hibernate.impl.SessionImpl - setting flush mode to: AUTO DEBUG btpool0-4 - /view-jobs org.hibernate.transaction.JDBCTransaction - begin DEBUG btpool0-4 - /view-jobs org.hibernate.jdbc.ConnectionManager - opening JDBC connection DEBUG btpool0-4 - /view-jobs org.hibernate.transaction.JDBCTransaction - current autocommit status: true DEBUG btpool0-4 - /view-jobs org.hibernate.transaction.JDBCTransaction - disabling autocommit TRACE btpool0-4 - /view-jobs org.hibernate.jdbc.JDBCContext - after transaction begin DEBUG btpool0-4 - /view-jobs org.springframework.orm.hibernate3.HibernateTransactionManager - Exposing Hibernate transaction as JDBC transaction [jdbc:hsqldb:mem:mysticpaste-test, UserName=SA, HSQL Database Engine Driver] DEBUG btpool0-4 - /view-jobs org.springframework.transaction.support.TransactionSynchronizationManager - Bound value [org.springframework.jdbc.datasource.connectionhol...@20dc10] for key [org.apache.commons.dbcp.basicdatasou...@1b289cd] to thread [btpool0-4 - /view-jobs] DEBUG btpool0-4 - /view-jobs org.springframework.transaction.support.TransactionSynchronizationManager - Initializing transaction synchronization TRACE btpool0-4 - /view-jobs org.springframework.transaction.interceptor.TransactionInterceptor - Getting transaction for [edu.chemeketa.careerconnect.persistence.EntityDao.get] DEBUG btpool0-4 - /view-jobs org.springframework.orm.hibernate3.SessionFactoryUtils - Opening Hibernate Session DEBUG btpool0-4 - /view-jobs org.hibernate.impl.SessionImpl - opened session at timestamp: 5127121449623553 DEBUG btpool0-4 - /view-jobs org.springframework.orm.hibernate3.SessionFactoryUtils - Registering Spring transaction synchronization for new Hibernate Session DEBUG btpool0-4 - /view-jobs org.springframework.transaction.support.TransactionSynchronizationManager - Bound value [org.springframework.orm.hibernate3.sessionhol...@14fceb7] for key [org.hibernate.impl.sessionfactoryi...@1be6544] to thread [btpool0-4 - /view-jobs] DEBUG btpool0-4 - /view-jobs org.springframework.transaction.support.TransactionSynchronizationManager - Retrieved value [org.springframework.orm.hibernate3.sessionhol...@14fceb7] for key [org.hibernate.impl.sessionfactoryi...@1be6544] bound to thread [btpool0-4 - /view-jobs] DEBUG btpool0-4 - /view-jobs org.springframework.orm.hibernate3.HibernateTemplate - Found thread-bound Session for HibernateTemplate TRACE btpool0-4 - /view-jobs org.hibernate.event.def.DefaultLoadEventListener - loading entity: [edu.chemeketa.careerconnect.model.EmployerInfo#250] TRACE btpool0-4 - /view-jobs org.hibernate.event.def.DefaultLoadEventListener - attempting to resolve: [edu.chemeketa.careerconnect.model.EmployerInfo#250] TRACE btpool0-4 - /view-jobs org.hibernate.event.def.DefaultLoadEventListener - object not resolved in any cache:
Re: Quick model/user/session question
filters are executed in the order they are defined, so put the osiv filter declaration before wicket. -igor On Thu, Aug 27, 2009 at 8:08 AM, Dane Lavertydanelave...@gmail.com wrote: Thanks for the suggestion. I've actually already got OpenSessionInViewFilter in my web.xml, like so: filter filter-namewicket.filter/filter-name filter-classorg.apache.wicket.protocol.http.WicketFilter/filter-class init-param param-nameapplicationFactoryClassName/param-name param-valueorg.apache.wicket.spring.SpringWebApplicationFactory/param-value /init-param /filter filter filter-nameopen.hibernate.session.in.view/filter-name filter-classorg.springframework.orm.hibernate3.support.OpenSessionInViewFilter/filter-class /filter !-- Important! This filter mapping must come before Wickets! -- filter-mapping filter-nameopen.hibernate.session.in.view/filter-name url-pattern/*/url-pattern /filter-mapping filter-mapping filter-namewicket.filter/filter-name url-pattern/*/url-pattern /filter-mapping Is there anything else I need to do in order to make OSIV work? Everything I've read says it just needs to be placed in the web.xml. Thanks, Dane On Wed, Aug 26, 2009 at 7:58 PM, Igor Vaynberg igor.vaynb...@gmail.comwrote: On Wed, Aug 26, 2009 at 6:30 PM, Dane Lavertydanelave...@gmail.com wrote: As I understand it, the LazyInitializationException is thrown because the Hibernate session closes after I call EntityDao.load(). But if that's the problem, then why should an LDM help? Won't the Hibernate session close again as soon as the LDM's load() is called? google OpenSessionInViewFilter, it keeps the hibernate session open for the entire request. -igor - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: Quick model/user/session question
Thanks for the suggestion. I've actually already got OpenSessionInViewFilter in my web.xml, like so: filter filter-namewicket.filter/filter-name filter-classorg.apache.wicket.protocol.http.WicketFilter/filter-class init-param param-nameapplicationFactoryClassName/param-name param-valueorg.apache.wicket.spring.SpringWebApplicationFactory/param-value /init-param /filter filter filter-nameopen.hibernate.session.in.view/filter-name filter-classorg.springframework.orm.hibernate3.support.OpenSessionInViewFilter/filter-class /filter !-- Important! This filter mapping must come before Wickets! -- filter-mapping filter-nameopen.hibernate.session.in.view/filter-name url-pattern/*/url-pattern /filter-mapping filter-mapping filter-namewicket.filter/filter-name url-pattern/*/url-pattern /filter-mapping Is there anything else I need to do in order to make OSIV work? Everything I've read says it just needs to be placed in the web.xml. Thanks, Dane On Wed, Aug 26, 2009 at 7:58 PM, Igor Vaynberg igor.vaynb...@gmail.comwrote: On Wed, Aug 26, 2009 at 6:30 PM, Dane Lavertydanelave...@gmail.com wrote: As I understand it, the LazyInitializationException is thrown because the Hibernate session closes after I call EntityDao.load(). But if that's the problem, then why should an LDM help? Won't the Hibernate session close again as soon as the LDM's load() is called? google OpenSessionInViewFilter, it keeps the hibernate session open for the entire request. -igor - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: Quick model/user/session question
More progress and another brick wall. After spending too many hours researching connection pools, it looks like the problem was actually a lack of @Transactional on the DAO method used by the EntityModel. Now I've added @Transactional, but that puts me back to getting the LazyInitializationException when I access one of PersonInfo's lazily loaded properties. Ugh... So now my question goes back to the smart EntityModel approach (as per http://wicketinaction.com/2008/09/building-a-smart-entitymodel/ ). When I search the mailing list, I see LDM/EntityModel given as the solution for LazyInitializationException. I don't understand why wrapping the object in a model should help (and in my case it doesn't help, probably because I'm implementing it wrong). As I understand it, the LazyInitializationException is thrown because the Hibernate session closes after I call EntityDao.load(). But if that's the problem, then why should an LDM help? Won't the Hibernate session close again as soon as the LDM's load() is called? well, regardless, let me echo Nino's tagline and say, Wicket for love! As frustrating as this is, I know it would be ten times more frustrating back in Struts-land, where I'm from. Dane On Tue, Aug 25, 2009 at 3:53 PM, Dane Laverty danelave...@gmail.com wrote: Good point. Now that I've switched to c3p0, I'm getting more debug info, i.e.: DEBUG - BasicResourcePool - [managed: 3, unused: 1, excluded: 0] DEBUG - BasicResourcePool - [managed: 3, unused: 0, excluded: 0] DEBUG - BasicResourcePool - [managed: 4, unused: 1, excluded: 0] DEBUG - BasicResourcePool - [managed: 4, unused: 0, excluded: 0] ... DEBUG - BasicResourcePool - [managed: 15, unused: 0, excluded: 0] DEBUG - BasicResourcePool - acquire test -- pool is already maxed out. [managed: 15; max: 15] It turns out that the problem has nothing to do with clicking really fast. After 15 clicks on any of the links in the app, it will freeze. I'm using wicket-auth for security, so the EntityModelUserInfo is inflating the UserInfo object on every page to check for permissions, and the connections are not being released. This was not an issue before I moved my UserInfo into the detachable EntityModel. I'll do some more research. Dane On Tue, Aug 25, 2009 at 3:34 PM, Edward Zarecor edw...@indeterminate.orgwrote: There's no connection pool size defined. Is the default pool size for dbcp 1? Ed. On Aug 25, 2009 5:29 PM, Dane Laverty danelave...@gmail.com wrote: I'm using dbcp, as per below. I'll try switching over to c3p0 and see if that helps. bean id=dataSourceOracle class=org.apache.commons.dbcp.BasicDataSource destroy-method=close property name=driverClassName value=${jdbc.oracle.driver}/ property name=url value=${jdbc.oracle.url}/ property name=username value=${jdbc.oracle.username}/ property name=password value=${jdbc.oracle.password}/ /bean On Tue, Aug 25, 2009 at 2:25 PM, Martijn Dashorst martijn.dasho...@gmail.com wrote: Do you use a connection pool? e.g. datasource definition in yo...
Re: Quick model/user/session question
On Wed, Aug 26, 2009 at 6:30 PM, Dane Lavertydanelave...@gmail.com wrote: As I understand it, the LazyInitializationException is thrown because the Hibernate session closes after I call EntityDao.load(). But if that's the problem, then why should an LDM help? Won't the Hibernate session close again as soon as the LDM's load() is called? google OpenSessionInViewFilter, it keeps the hibernate session open for the entire request. -igor - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: Quick model/user/session question
Progress is being made. Thanks again for your suggestion, Martijn. I discovered this thread ( http://www.nabble.com/Storing-user-entity-in-session--td22113666.html#a22113666) where you discussed putting the user in the RequestCycle in some more detail. That helped me rebuild my RequestCycle [1]. The new RequestCycle solved the LazyInitializationException, but created a new problem. The application runs fine, but if I click a link twice in rapid succession, the application hangs for all users until I restart the server. This is kind of a major problem :) I've pasted the server output below [2]. The console stops on the line DEBUG - ConnectionManager - opening JDBC connection for a couple minutes, then throws the java.net.SocketException: Connection reset stack trace. Googling java.net.SocketException: Connection reset shows that the error is connected to a wide array of issues. Has anyone here run into the problem before? And if so, how did you solve it? thanks, Dane --- [1] - public class WicketRequestCycle extends WebRequestCycle implements Serializable { EntityModelUserInfo userInfoModel; ... public UserInfo getUserInfo() { if (userInfoModel != null) return userInfoModel.getObject(); UserInfo userInfo = WicketSession.get().generateUserInfo(); if (userInfo == null) return null; userInfoModel = new EntityModelUserInfo(userInfo); return userInfoModel.getObject(); } @Override public void detach() { super.detach(); if (userInfoModel != null) userInfoModel.detach(); } } [2] - TRACE - SessionImpl- closing session TRACE - ConnectionManager - connection already null in cleanup : no action DEBUG - log- RESPONSE /images/lotus.png 200 DEBUG - log- REQUEST /login on org.mortbay.jetty.httpconnect...@7d0f44 DEBUG - log- Got Session ID 1haooq2s24av1 from cookie DEBUG - log- sessionmanager=org.mortbay.jetty.servlet.hashsessionmana...@3411a DEBUG - log- session=org.mortbay.jetty.servlet.HashSessionManager$Session:1haooq2s24...@18296160 DEBUG - log- servlet=default DEBUG - log- chain=open.hibernate.session.in.view-wicket.careerconnect-default DEBUG - log- servelet holder=default DEBUG - log- call filter open.hibernate.session.in.view DEBUG - OpenSessionInViewFilter- Using SessionFactory 'sessionFactory' for OpenSessionInViewFilter DEBUG - DefaultListableBeanFactory - Returning cached instance of singleton bean 'sessionFactory' DEBUG - OpenSessionInViewFilter- Opening single Hibernate Session in OpenSessionInViewFilter DEBUG - SessionFactoryUtils- Opening Hibernate Session DEBUG - SessionImpl- opened session at timestamp: 5125043523203072 TRACE - SessionImpl- setting flush mode to: NEVER DEBUG - tionSynchronizationManager - Bound value [org.springframework.orm.hibernate3.sessionhol...@117a49c] for key [org.hibernate.impl.sessionfactoryi...@737f58] to thread [btpool0-4 - /login;jsessionid=1haooq2s24av1?wicket:interface=:0:loginForm::IFormSubmitListener::] DEBUG - log- call filter wicket.careerconnect DEBUG - SessionFactoryUtils- Opening Hibernate Session DEBUG - SessionImpl- opened session at timestamp: 5125043523203073 TRACE - QueryPlanCache - located HQL query plan in cache ( select employerInfo from EmployerInfo as employerInfo inner join employerInfo.contactPoints as contactPoints where contactPoints.contactInfo = ? and employerInfo.password = md5_digest(?)) TRACE - QueryPlanCache - located HQL query plan in cache ( select employerInfo from EmployerInfo as employerInfo inner join employerInfo.contactPoints as contactPoints where contactPoints.contactInfo = ? and employerInfo.password = md5_digest(?)) TRACE - HQLQueryPlan - find: select employerInfo from EmployerInfo as employerInfo inner join employerInfo.contactPoints as contactPoints where contactPoints.contactInfo = ? and employerInfo.password = md5_digest(?) TRACE - QueryParameters- parameters: [dane, asdf] TRACE - QueryParameters- named parameters: {} DEBUG - AbstractBatcher- about to open PreparedStatement (open PreparedStatements: 0, globally: 4) DEBUG - ConnectionManager - opening JDBC connection DEBUG - log- EXCEPTION java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:168) at org.mortbay.io.ByteArrayBuffer.readFrom(ByteArrayBuffer.java:172) at org.mortbay.io.bio.StreamEndPoint.fill(StreamEndPoint.java:107) at org.mortbay.jetty.bio.SocketConnector$Connection.fill(SocketConnector.java:196) at
Re: Quick model/user/session question
I'm using dbcp, as per below. I'll try switching over to c3p0 and see if that helps. bean id=dataSourceOracle class=org.apache.commons.dbcp.BasicDataSource destroy-method=close property name=driverClassName value=${jdbc.oracle.driver}/ property name=url value=${jdbc.oracle.url}/ property name=username value=${jdbc.oracle.username}/ property name=password value=${jdbc.oracle.password}/ /bean On Tue, Aug 25, 2009 at 2:25 PM, Martijn Dashorst martijn.dasho...@gmail.com wrote: Do you use a connection pool? e.g. datasource definition in your container, dbcp or c3p0? If not, use one. Martijn On Tue, Aug 25, 2009 at 11:10 PM, Dane Lavertydanelave...@gmail.com wrote: I think I've discovered the source of the problem, but not the solution. On a normal page request, the console output says: DEBUG - log- REQUEST /post-job on org.mortbay.jetty.httpconnect...@1b9db06 ... DEBUG - ConnectionManager - opening JDBC connection DEBUG - SQL- select jobcategor0_.job_category_id... And everything goes normally from there. But on double-clicking the link, the console says: DEBUG - log- REQUEST /post-job on org.mortbay.jetty.httpconnect...@1b9db06 ... DEBUG - ConnectionManager - opening JDBC connection DEBUG - log- REQUEST /post-job on org.mortbay.jetty.httpconnect...@a78af0 ... DEBUG - ConnectionManager - opening JDBC connection And then the application freezes. Apparently it is trying to open a second JDBC connection before the first one closed, and something doesn't like that. I'm not sure where to start looking to solve this -- any suggestions? thanks again, Dane On Tue, Aug 25, 2009 at 1:22 PM, Dane Laverty danelave...@gmail.com wrote: Progress is being made. Thanks again for your suggestion, Martijn. I discovered this thread ( http://www.nabble.com/Storing-user-entity-in-session--td22113666.html#a22113666) where you discussed putting the user in the RequestCycle in some more detail. That helped me rebuild my RequestCycle [1]. The new RequestCycle solved the LazyInitializationException, but created a new problem. The application runs fine, but if I click a link twice in rapid succession, the application hangs for all users until I restart the server. This is kind of a major problem :) I've pasted the server output below [2]. The console stops on the line DEBUG - ConnectionManager - opening JDBC connection for a couple minutes, then throws the java.net.SocketException: Connection reset stack trace. Googling java.net.SocketException: Connection reset shows that the error is connected to a wide array of issues. Has anyone here run into the problem before? And if so, how did you solve it? thanks, Dane --- [1] - public class WicketRequestCycle extends WebRequestCycle implements Serializable { EntityModelUserInfo userInfoModel; ... public UserInfo getUserInfo() { if (userInfoModel != null) return userInfoModel.getObject(); UserInfo userInfo = WicketSession.get().generateUserInfo(); if (userInfo == null) return null; userInfoModel = new EntityModelUserInfo(userInfo); return userInfoModel.getObject(); } @Override public void detach() { super.detach(); if (userInfoModel != null) userInfoModel.detach(); } } [2] - TRACE - SessionImpl- closing session TRACE - ConnectionManager - connection already null in cleanup : no action DEBUG - log- RESPONSE /images/lotus.png 200 DEBUG - log- REQUEST /login on org.mortbay.jetty.httpconnect...@7d0f44 DEBUG - log- Got Session ID 1haooq2s24av1 from cookie DEBUG - log- sessionmanager=org.mortbay.jetty.servlet.hashsessionmana...@3411a DEBUG - log- session=org.mortbay.jetty.servlet.HashSessionManager$Session:1haooq2s24...@18296160 DEBUG - log- servlet=default DEBUG - log- chain=open.hibernate.session.in.view-wicket.careerconnect-default DEBUG - log- servelet holder=default DEBUG - log- call filter open.hibernate.session.in.view DEBUG - OpenSessionInViewFilter- Using SessionFactory 'sessionFactory' for OpenSessionInViewFilter DEBUG - DefaultListableBeanFactory - Returning cached instance of singleton bean 'sessionFactory' DEBUG - OpenSessionInViewFilter- Opening single Hibernate Session in OpenSessionInViewFilter DEBUG - SessionFactoryUtils- Opening Hibernate Session DEBUG - SessionImpl- opened session at timestamp: 5125043523203072
Re: Quick model/user/session question
There's no connection pool size defined. Is the default pool size for dbcp 1? Ed. On Aug 25, 2009 5:29 PM, Dane Laverty danelave...@gmail.com wrote: I'm using dbcp, as per below. I'll try switching over to c3p0 and see if that helps. bean id=dataSourceOracle class=org.apache.commons.dbcp.BasicDataSource destroy-method=close property name=driverClassName value=${jdbc.oracle.driver}/ property name=url value=${jdbc.oracle.url}/ property name=username value=${jdbc.oracle.username}/ property name=password value=${jdbc.oracle.password}/ /bean On Tue, Aug 25, 2009 at 2:25 PM, Martijn Dashorst martijn.dasho...@gmail.com wrote: Do you use a connection pool? e.g. datasource definition in yo...
Re: Quick model/user/session question
Good point. Now that I've switched to c3p0, I'm getting more debug info, i.e.: DEBUG - BasicResourcePool - [managed: 3, unused: 1, excluded: 0] DEBUG - BasicResourcePool - [managed: 3, unused: 0, excluded: 0] DEBUG - BasicResourcePool - [managed: 4, unused: 1, excluded: 0] DEBUG - BasicResourcePool - [managed: 4, unused: 0, excluded: 0] ... DEBUG - BasicResourcePool - [managed: 15, unused: 0, excluded: 0] DEBUG - BasicResourcePool - acquire test -- pool is already maxed out. [managed: 15; max: 15] It turns out that the problem has nothing to do with clicking really fast. After 15 clicks on any of the links in the app, it will freeze. I'm using wicket-auth for security, so the EntityModelUserInfo is inflating the UserInfo object on every page to check for permissions, and the connections are not being released. This was not an issue before I moved my UserInfo into the detachable EntityModel. I'll do some more research. Dane On Tue, Aug 25, 2009 at 3:34 PM, Edward Zarecor edw...@indeterminate.orgwrote: There's no connection pool size defined. Is the default pool size for dbcp 1? Ed. On Aug 25, 2009 5:29 PM, Dane Laverty danelave...@gmail.com wrote: I'm using dbcp, as per below. I'll try switching over to c3p0 and see if that helps. bean id=dataSourceOracle class=org.apache.commons.dbcp.BasicDataSource destroy-method=close property name=driverClassName value=${jdbc.oracle.driver}/ property name=url value=${jdbc.oracle.url}/ property name=username value=${jdbc.oracle.username}/ property name=password value=${jdbc.oracle.password}/ /bean On Tue, Aug 25, 2009 at 2:25 PM, Martijn Dashorst martijn.dasho...@gmail.com wrote: Do you use a connection pool? e.g. datasource definition in yo...
Re: Quick model/user/session question
Don't put the models in your session! Session access is not guaranteed to be confined to a single thread - multi window support, resources and such all attach the session to their own threads, making the session non-thread safe. Best option is to put the ID of your entities in your session object, and store the entities in your request cycle for request processing. Martijn On Mon, Aug 24, 2009 at 9:21 PM, Dane Lavertydanelave...@gmail.com wrote: I understand that a Hibernate-generated object needs to be kept in a LoadableDetachableModel in order to avoid errors across requests. I also understand that a LDM has to belong to a component in order for its detach to be called at the end of a request. So what should I do with Hibernate-generated objects that live in the session, specifically a UserInfo object? Since the session doesn't have a model, how do I inform Wicket to detach these models after each request? thanks, Dane -- Become a Wicket expert, learn from the best: http://wicketinaction.com Apache Wicket 1.4 increases type safety for web applications Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.4.0 - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: Quick model/user/session question
Do you mean that the database should be queried for every persistent session object on every request? On Mon, Aug 24, 2009 at 2:12 PM, Martijn Dashorst martijn.dasho...@gmail.com wrote: Don't put the models in your session! Session access is not guaranteed to be confined to a single thread - multi window support, resources and such all attach the session to their own threads, making the session non-thread safe. Best option is to put the ID of your entities in your session object, and store the entities in your request cycle for request processing. Martijn On Mon, Aug 24, 2009 at 9:21 PM, Dane Lavertydanelave...@gmail.com wrote: I understand that a Hibernate-generated object needs to be kept in a LoadableDetachableModel in order to avoid errors across requests. I also understand that a LDM has to belong to a component in order for its detach to be called at the end of a request. So what should I do with Hibernate-generated objects that live in the session, specifically a UserInfo object? Since the session doesn't have a model, how do I inform Wicket to detach these models after each request? thanks, Dane -- Become a Wicket expert, learn from the best: http://wicketinaction.com Apache Wicket 1.4 increases type safety for web applications Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.4.0 - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: Quick model/user/session question
I took your advice and added a UserInfo variable to the RequestCycle [1]. Now my pages look for the UserInfo in the RequestCycle. If it's null, the RequestCycle loads it from the ID in Session [2]. However, I still get the LazyInitializationException when a page wants to access a collection from userInfo [3], presumably because the Hibernate session was closed after the Session loads the UserInfo. I thought that the OpenSessionInViewFilter was supposed to keep the session open during the entire request, but apparently I'm using it wrong. [1] - public class WicketRequestCycle extends WebRequestCycle implements Serializable { UserInfo userInfo; ... public UserInfo getUserInfo() { if (userInfo != null) return userInfo; userInfo = WicketSession.get().generateUserInfo(); return userInfo; } } [2] - public class WicketSession extends AuthenticatedWebSession { @SpringBean(name = userInfoDao) private UserInfoDao userInfoDao; private Long userInfoID; ... public UserInfo generateUserInfo() { if (userInfoID == null) return null; return personInfoDao.load(personInfoId, personInfoClass); } } [3] - public class UserRolesAuthorizer implements IRoleCheckingStrategy { public boolean hasAnyRole(Roles roles) { PersonInfo personInfo = WicketRequestCycle.get().getPersonInfo(); // THIS NEXT LINE THROWS THE ERROR, since it's trying to load BasicUser return userInfo.getBasicUser().hasAnyRole(roles); } } On Mon, Aug 24, 2009 at 2:12 PM, Martijn Dashorst martijn.dasho...@gmail.com wrote: Don't put the models in your session! Session access is not guaranteed to be confined to a single thread - multi window support, resources and such all attach the session to their own threads, making the session non-thread safe. Best option is to put the ID of your entities in your session object, and store the entities in your request cycle for request processing. Martijn On Mon, Aug 24, 2009 at 9:21 PM, Dane Lavertydanelave...@gmail.com wrote: I understand that a Hibernate-generated object needs to be kept in a LoadableDetachableModel in order to avoid errors across requests. I also understand that a LDM has to belong to a component in order for its detach to be called at the end of a request. So what should I do with Hibernate-generated objects that live in the session, specifically a UserInfo object? Since the session doesn't have a model, how do I inform Wicket to detach these models after each request? thanks, Dane -- Become a Wicket expert, learn from the best: http://wicketinaction.com Apache Wicket 1.4 increases type safety for web applications Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.4.0 - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org