package org.jboss.seam.framework; import java.io.Serializable; import org.hibernate.Session; import org.hibernate.TransientObjectException; import org.jboss.seam.annotations.Transactional; /** * Base class for Home objects for Hibernate entities. * * @author Gavin King * */ public class HibernateEntityHome<E> extends Home<Session, E> { private static final long serialVersionUID = 6071072408602519385L; @Override public void create() { super.create(); if ( getSession()==null ) { throw new IllegalStateException("hibernateSession is null"); } } @Transactional public boolean isManaged() { return getInstance()!=null && getSession().contains( getInstance() ); } @Transactional public String update() { getSession().flush(); updatedMessage(); raiseAfterTransactionSuccessEvent(); return "updated"; } @Transactional public String persist() { getSession().persist( getInstance() ); getSession().flush(); assignId( getSession().getIdentifier( getInstance() ) ); createdMessage(); raiseAfterTransactionSuccessEvent(); return "persisted"; } @Transactional public String remove() { getSession().delete( getInstance() ); getSession().flush(); deletedMessage(); raiseAfterTransactionSuccessEvent(); return "removed"; } @Transactional @Override public E find() { if (getSession().isOpen()) { E result = loadInstance(); if (result==null) { result = handleNotFound(); } return result; } else { return null; } } protected E loadInstance() { return (E) getSession().get(getEntityClass(), (Serializable) getId()); } @Override protected void joinTransaction() { getSession().isOpen(); } public Session getSession() { return getPersistenceContext(); } public void setSession(Session session) { setPersistenceContext(session); } @Override protected String getPersistenceContextName() { return "hibernateSession"; } @Override protected String getEntityName() { try { return getSession().getEntityName(getInstance()); } catch (TransientObjectException e) { return getSession().getSessionFactory().getClassMetadata(getInstance().getClass()).getEntityName(); } } }