我遇到了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");
答案 0 :(得分:1)
您正在访问事务外部的实体。您需要将服务方法标记为事务性。
在您当前的代码中,当您的dao方法完成时,您的事务就会结束,所以当您在服务方法中访问该实体时,它就是分离的实体,这肯定会引发异常。
请记住,您需要在服务中启动事务而不是DAO,这将允许您访问子实体。所以将@transactional注释移动到您的服务方法。