0

我对 Hiberante 和 Spring 有疑问。

当我得到一个实体时,一切正常,但是如果我使用子属性,延迟加载由于关闭会话而失败......为什么这么早休眠关闭会话?迫不及待地退出服务或每个线程占用一个会话?

这是我的配置

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan">
        <list>
            <value>com.cinebot.db.entity</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

这是我的道:

@Transactional
public class Dao {


    @Autowired
    private SessionFactory sessionFactory;

    public Session getSession(){
        return sessionFactory.getCurrentSession();
    }

    @SuppressWarnings("unchecked")
    public <T> T get(Class<T> classe, Serializable id) throws Exception {
        if(id==null) return null;
        T obj = (T) getSession().get(classe, id);
        return obj;
    }

}

这就是我在 @Service 类中得到错误的地方(getEventi() 是延迟加载的):

    Spettacoli spettacolo = dao.get(Spettacoli.class, spettacoloId);
   if(spettacolo.getEventi().getScadenza()>0) throw new LogicalException("Spettacolo scaduto");
4

1 回答 1

1

您正在访问事务之外的实体。您需要将服务方法标记为事务性。

在您当前的代码中,您的事务在您的 dao 方法完成时结束,因此当您在服务方法中访问该实体时,它是分离的实体,这肯定会引发异常。

Remember you need to start transaction in service and not DAO which will allow you to access child entities. So move @transactional annotation to your service method.

于 2012-07-04T13:22:06.747 回答