Ok. Maybe I don't understand...
Let me show the situation. I have Spring + portlet + hibernate config
with transactions working with the current configuration:
I have my DAO objects under package
com.level2crm.hibernate.enterprise.dao.contact
And model under com.level2crm.model
I configured one advice:
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- the transactional semantics... -->
<tx:attributes>
<!-- all methods starting with 'get' are read-only -->
<tx:method name="get*" propagation="REQUIRED"
read-only="true" />
<!-- other methods use the default transaction settings
(see below)
-->
<tx:method name="*" propagation="REQUIRED" /> <!--
propagation="SUPPORTS" -->
</tx:attributes>
</tx:advice>
And several pointcuts:
<aop:config>
<aop:pointcut id="allModelOperation" expression="execution(*
com.level2crm.model..*+.*(..))"/>
<aop:advisor advice-ref="txAdvice"
pointcut-ref="allModelOperation"/>
</aop:config>
<aop:config>
<aop:pointcut id="allDAO" expression="execution(*
com.level2crm.hibernate.enterprise.dao..*+.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="allDAO"/>
</aop:config>
<aop:config>
<aop:pointcut id="TRG" expression="execution(*
com.trg.dao.hibernate.*+.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="TRG"/>
</aop:config>
<!-- This one does not work -->
<aop:config>
<aop:pointcut id="portlets" expression="execution(*
com.level2crm.portals.crm.wicket.customerlist.pages..*+.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="portlets"/>
</aop:config>
I tried to configure the open session in view (web.xml):
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Enable the filters for Hibernate -->
<filter>
<filter-name>opensessioninview</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>opensessioninview</filter-name>
<url-pattern>/hibernate/*</url-pattern>
</filter-mapping>
<!-- END hibernate filters -->
But I found that this does not work. Because:
public class ViewModePage extends org.apache.wicket.markup.html.WebPage
{
...
@SpringBean(name = "userDAOBean")
private UserDAO userDAO;
IModel loadableUserModel = new LoadableDetachableModel() {
@Override
protected Object load(){
User selectedUser = null;
String value =
((PortletRequestContext)RequestContext.get()).getPortletRequest().getParameter("crmportal:userId");
if(value!=null)
{
UuidUserType uuid =
UuidUserType.fromString(value); //Works!!
userDAO.testSessoion(uuid);//Works!!
selectedUser = userDAO.find(uuid);//Works!!
if(!userDAO.isAttached(selectedUser)) //Works!!
But is not
attached!!!
{
userDAO.save(selectedUser); //Attach it
//Works!! It
saves/updates the object but it's still not attached
}
Set<ContactBasicDetail> setDetails =
selectedUser.getContactBasicDetails(); //Works!! It gets the set
setDetails.isEmpty(); // FAIL FAIL Cannot load
lazy
return setDetails.toArray();
}
return null;
}
};
...
}
This load() function does not work! It makes the exception. But:
1.- It can get the User. Because the pointcut works inside the
DAO?
2.- It can save the object. Because the pointcut works inside
the DAO?
3.- It can get the Set. Because the pointcut works inside the
DAO?
The userDAO.testSessoion(uuid); function inside the DAO object works.
What I do is to get the Hibernate session, check that is ok. And check
also if the transaction was created and I can attach and use object.
Inside the userDAO.testSessoion function I do the same code that in the
load() function but this time everything works!
I'm sure that it works because it has a session and a open transaction
due to the pointcut defined as follows works above:
<aop:config>
<aop:pointcut id="allDAO" expression="execution(*
com.level2crm.hibernate.enterprise.dao..*+.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="allDAO"/>
</aop:config>
What is not working is the pointcut that should provide a
transaction/session to the page:
<!-- This one does not work -->
<aop:config>
<aop:pointcut id="portlets" expression="execution(*
com.level2crm.portals.crm.wicket.customerlist.pages..*+.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="portlets"/>
</aop:config>
And I think this has something to do with the hibernate+wicket
configuration. As the page is not created by the Spring bean interface
it cannot
make a proxy around it. So it will never get the session/transaction.
Opening a session with the view manually will make my pointcuts not
usable so I will loose the control over what classes
will be managed and over transactions. Do will I?
> >> Yup so you should either use open session in view or more preferred
> >> AFAIK detachable models.
Yep, I do it but it does not work. Indeed it fails inside the load()
function. That makes me thing something is wrong configured...