我其實看到了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和服務的這種特殊情況下,我會非常感謝...
那麼,我正在思考這些相同的路線,但我需要一些確認。謝謝。 – Less 2011-03-15 14:18:06