Here is some sample code for my mapping bean idea:
Code:
<bean name="mySessionUtil" class="dejanp.spring.HibernateSessionUtil">
<property name="localSessionFactoryBeans">
<list>
<ref bean="&mySessionFactory"/>
</list>
</property>
<property name="mappings">
<map>
<entry key="dejanp.test.TestDomainClass">
<ref bean="mySessionFactory"/>
</entry>
</map>
</property>
</bean>
So, one can use a list of LocalSessionFactoryBeans or a manually filled map or both to init the bean.
Code:
package dejanp.spring;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.mapping.PersistentClass;
import org.springframework.orm.hibernate.LocalSessionFactoryBean;
import org.springframework.orm.hibernate.SessionFactoryUtils;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class HibernateSessionUtil {
private static Map<String, SessionFactory> map;
public HibernateSessionUtil() {
map = new HashMap<String, SessionFactory>();
}
public void setLocalSessionFactoryBeans(List<LocalSessionFactoryBean> localSessionFactoryBeans) {
for (LocalSessionFactoryBean localSessionFactoryBean : localSessionFactoryBeans) {
addLocalSessionFactoryBean(localSessionFactoryBean);
}
}
private void addLocalSessionFactoryBean(LocalSessionFactoryBean localSessionFactoryBean) {
Configuration config = localSessionFactoryBean.getConfiguration();
SessionFactory sessionFactory = (SessionFactory) localSessionFactoryBean.getObject();
Iterator classMappings = config.getClassMappings();
while (classMappings.hasNext()) {
PersistentClass persistentClass = (PersistentClass) classMappings.next();
String name = persistentClass.getMappedClass().getName();
map.put(name, sessionFactory);
}
}
public void setMappings(Map<String, SessionFactory> map) {
HibernateSessionUtil.map.putAll(map);
}
private static SessionFactory getSessionFactory(Class c) {
return getSessionFactory(c.getName());
}
private static SessionFactory getSessionFactory(String name) {
return map.get(name);
}
public static Session getSession(Class c, boolean allowCreate) {
return SessionFactoryUtils.getSession(getSessionFactory(c), allowCreate);
}
}
Typical usage would be something like:
Code:
public class Order{
....
public Collection getSomeOrderItems(...) {
Session session = HibernateSessionUtil.getSession(Order.class, false);
...
}
}