2011-03-15 87 views
3

我其实看到了this question,但无法从中获得太多,所以我会尽量更具体一些。
我在多用户网络的应用BaseDAO类,看起来像这样:spring-hibernate多用户web-app中的DAO作用域?

public abstract class BaseDAO<GenType> 
{ 
private HibernateOperations hibernateTemplate; 

protected BaseDAO() {} 
protected HibernateOperations getHibernateTemplate() { 
    return hibernateTemplate; 
} 
public void setHibernateTemplate(HibernateOperations hibernateTemplate) { 
    this.hibernateTemplate = hibernateTemplate; 
} 
protected void initialize(final Object proxy) throws DataAccessException { 
    hibernateTemplate.initialize(proxy); 
} 
public GenType merge(GenType entity) throws DataAccessException { 
    return (GenType)hibernateTemplate.merge(entity); 
} 
protected void persist(GenType entity) throws DataAccessException { 
    hibernateTemplate.persist(entity); 
} 
public void refresh(GenType entity) throws DataAccessException { 
    hibernateTemplate.refresh(entity); 
} 
public void save(GenType entity) throws DataAccessException { 
    hibernateTemplate.save(entity); 
} 
public void saveOrUpdate(GenType entity) throws DataAccessException { 
    hibernateTemplate.saveOrUpdate(entity); 
} 
public void update(GenType entity) throws DataAccessException { 
    hibernateTemplate.update(entity); 
} 
public void delete(GenType entity) throws DataAccessException { 
    hibernateTemplate.delete(entity); 
} 
protected void deleteAll(Collection<GenType> entities) throws DataAccessException { 
    hibernateTemplate.deleteAll(entities); 
} 
protected GenType get(Class<GenType> entityClass, Serializable id) throws DataAccessException { 
    return (GenType)hibernateTemplate.get(entityClass, id); 
} 
} 

它基本上包装器的HibernateTemplate。我所有其他的DAO继承这个类并实现适当的接口,它们包含一些额外的方法(如getBySomeAttribute())。所以基本上这些DAO有只有方法。此外,我有服务层包装DAO。也就是说,一个服务类可以容纳多个DAO,并且来自服务层的方法调用被自动提交/回滚(事务拒绝)的spring-AOP拦截。例如:

public class ModelDAO extends BaseDAO<Model> implements IModelDAO 
{ 
    @Override 
    public Model getNew() { 
     return new Model(); 
    } 

    @Override 
    public List<Model> getBySomeAttr() { 
     DetachedCriteria criteria; 
     // define some criteria 
     return getHibernateTemplate().findByCriteria(criteria); 
    } 
} 

... 

public class ModelService 
{ 
    private ModelDAO modelDAO; 
    private ElementDAO elementDAO; 
    // GET/SET for model and user DAO 

    public void doSomethingWithModel() { 

     modelDAO.doSomething(); 
     elementDAO.doSomethingElse(); 
    } 
} 

配置如下:

<bean id="hibernateTemplate2" class="org.springframework.orm.hibernate3.HibernateTemplate"> 
    <property name="sessionFactory" ref="sessionFactory2" /> 
    <property name="maxResults" value="3000" /> 
</bean> 

<!-- DAO --> 
<bean id="baseDAO" abstract="true" 
    class="org.irvas.backend.dao_implement.BaseDAO" scope="session"> 
    <property name="hibernateTemplate" ref="hibernateTemplate2" /> 
</bean> 
<bean id="modelDAO" 
    class="org.irvas.backend.dao_implement.ModelDAOImplement" 
    parent="baseDAO" scope="session"> 
</bean> 
<bean id="elementDAO" 
    class="org.irvas.backend.dao_implement.ElementDAOImplement" 
    parent="baseDAO" scope="session"> 
</bean> 

<!-- Service --> 
<bean id="modelService" 
    class="org.irvas.backend.service_implement.ModelServiceImplement" scope="session"> 
    <property name="modelDAO" ref="modelDAO" /> 
    <property name="elementDAO" ref="elementDAO" /> 
</bean> 
<bean id="elementService" 
    class="org.irvas.backend.service_implement.ElementServiceImplement" scope="session"> 
    <property name="elementDAO" ref="elementDAO" /> 
</bean> 

所以,我不知道我应该如何范围DAO /服务豆多用户的目的呢?我正在将服务bean注入到原型用于GUI的控制器。 当我使用这个配置(示波器=“会议”),我得到错误,如:

错误创建名为“modelService”豆:java.lang.IllegalArgumentException异常的setAttribute:非序列化的属性:modelDAO

我想说这是从Tomcat的StandardSession.setAttribute()中抛出的。由此我可以得出结论,我的DAO应实现Serializable,什么混淆我更是我看到没有实现Serializable接口工作完全相同的代码...

如果有人能够告诉我什么是怎么回事,和如何范围DAO和服务的这种特殊情况下,我会非常感谢...

回答

3

有没有必要使您的DAO会话范围。

尽管Hibernate会话有一个状态,但在正确配置的事务管理下,它的状态绑定到事务(即在同一事务内调用的不同DAO方法共享同一会话,而从不同事务调用的相同方法使用不同会话)。

因此,您的DAO实际上是无状态的,应该是单一范围的(即默认范围)。

+0

那么,我正在思考这些相同的路线,但我需要一些确认。谢谢。 – Less 2011-03-15 14:18:06