我其实看到了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