Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate和spring会话配置_Spring_Hibernate_Session - Fatal编程技术网

Hibernate和spring会话配置

Hibernate和spring会话配置,spring,hibernate,session,Spring,Hibernate,Session,我对冬眠和春天有问题 当我得到一个实体时,一切都正常,但是如果我使用一个子实体,延迟加载会由于关闭会话而失败。。。为什么这么早就休眠关闭会话?无法等待退出服务或每个线程进行一次会话 这是我的配置 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"

我对冬眠和春天有问题

当我得到一个实体时,一切都正常,但是如果我使用一个子实体,延迟加载会由于关闭会话而失败。。。为什么这么早就休眠关闭会话?无法等待退出服务或每个线程进行一次会话

这是我的配置

<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>

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

在当前代码中,事务在dao方法完成时结束,所以当您在服务方法中访问该实体时,它是分离的实体,这肯定会导致异常


请记住,您需要在服务中启动事务,而不是DAO,这将允许您访问子实体。因此,将@transactional注释移动到您的服务方法。

您访问实体属性的位置?在@service类中,在使用getSession()获取实体之后。get()可以在此处显示服务方法代码,包括dao方法吗?需要查看事务注释我用这些信息编辑了问题。。。谢谢谢谢你Sunil但我还有一个问题。如果我的控制器中需要一个惰性属性(例如),我应该在那里添加事务属性吗?不,你必须在那里使用传输对象。按照设计惯例,您不应将实体携带到控制器,而应使用传输对象携带实体信息。传输对象(TO)只是java 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;
    }
    Spettacoli spettacolo = dao.get(Spettacoli.class, spettacoloId);
   if(spettacolo.getEventi().getScadenza()>0) throw new LogicalException("Spettacolo scaduto");