gpt4 book ai didi

hibernate - spring-hibernate 多用户网络应用程序中的 DAO 范围?

转载 作者:行者123 更新时间:2023-12-02 23:31:54 25 4
gpt4 key购买 nike

我实际上看到了this question ,但无法从中得到太多信息,所以我会尝试更具体地说明我的内容。
我的多用户网络应用程序中有 BaseDAO 类,如下所示:

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 都继承此类并实现适当的接口(interface),其中包含一些附加方法(如 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/Service beans 的范围?我将服务 bean 注入(inject)到 GUI 的原型(prototype) Controller 中。当我使用此配置(使用scope =“session”)时,我收到如下错误:

Error creating bean with name 'modelService': java.lang.IllegalArgumentException setAttribute: Non-serializable attribute: modelDAO

我想说这是从 Tomcat 的 StandardSession.setAttribute() 抛出的。由此我可以得出结论,我的 DAO 应该实现 Serialized,更让我困惑的是,我看到了完全相同的代码,无需实现 Serialized...

如果有人能告诉我这里发生了什么,以及如何针对这个特定案例确定 DAO 和服务的范围,我将非常感激......

最佳答案

无需将您的 DAO 限制在 session 范围内。

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

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

关于hibernate - spring-hibernate 多用户网络应用程序中的 DAO 范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5312716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com