2011-03-15 84 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