/**
*
*/
package org.jboss.seam.example.spring;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
/**
* A Service to demonstrate/test some different methods of accessing Seam Managed Hibernate Session in Spring.
* @author Mike Youngstrom
*/
public class HibernateTestService extends HibernateDaoSupport {
public static final String HIBERNATE_HOTEL_NAME = "This is the Hibernate Hotel";
public static final String HIBERNATE_HOTEL_ADDRESS = "Hibernate Address";
private TransactionTemplate hibernateTransactionTemplate;
public void testHibernateIntegration() {
hibernateTransactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
// Testing access through HibernateTemplate
Hotel hotel = (Hotel)getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(org.hibernate.Session session) throws HibernateException, SQLException {
return getFirstHotel(session);
}
});
hotel.setName(HIBERNATE_HOTEL_NAME);
return null;
}
});
hibernateTransactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
// Testing access through SessionFactory.getCurrentSession()
Hotel hotel = getFirstHotel(getSessionFactory().getCurrentSession());
if (!HIBERNATE_HOTEL_NAME.equals(hotel.getName())) {
throw new RuntimeException("Hotel name not set. Hibernate integration not working.");
}
hotel.setAddress(HIBERNATE_HOTEL_ADDRESS);
return null;
}
});
hibernateTransactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
// Testing access through SessionFactory.getCurrentSession()
Hotel hotel = getFirstHotel(getSessionFactory().getCurrentSession());
if (!HIBERNATE_HOTEL_ADDRESS.equals(hotel.getAddress())) {
throw new RuntimeException("Hotel address not set. Hibernate integration not working.");
}
return null;
}
});
}
/**
* @return
*/
private Hotel getFirstHotel(Session session) {
List<Hotel> results = session.createQuery("from Hotel").list();
if (results.size() <= 0) {
throw new RuntimeException("Hibernate integration is broken");
}
Hotel hotel = results.get(0);
return hotel;
}
/**
* @param transactionTemplate the transactionTemplate to set
*/
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.hibernateTransactionTemplate = transactionTemplate;
}
}