hibernate的懒加载异常
1. 问题
最近写了一个demo,可是一直显示懒加载异常,自己也是很郁闷!
2. 解决
记得之前学习hibernate过程中,一般hibernate若使用了懒加载,且session关闭了,那么在使用它,就会出现懒加载异常。所以问题就出在关闭session上,由于自己为了可以测试dao,所以在spring配置文件中把事务弄在dao的实现方法上。只要把事务绑定在service中的方法即可,可是这样就会导致另一个问题,测试方法无法进行,ide会提示sessioin不在当前进程中。其实我们可以先把事务绑定给dao的实现方法,先测试没有懒加载的方法,之后在把事务绑定给service,然后在service中顺便测试一下那些懒加载的方法。
3. 代码
spring配置文件
<!--自动扫描的包-->
<context:component-scan base-package="com.mulin.demo">
</context:component-scan>
<!-- 配置数据源-->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="comboPooledDataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="initialPoolSize" value="${jdbc.initialPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>
<!-- 配置sessionFactory-->
<bean id="localSessionFactoryBean"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="comboPooledDataSource"></property>
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
<property name="mappingLocations" value="classpath:com/mulin/demo/domain/*.hbm.xml"></property>
</bean>
<!-- 配置事务管理器-->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="localSessionFactoryBean"></property>
</bean>
<!-- 配置事务之间的方法关系 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 配置事务的切点-->
<aop:config>
<aop:pointcut expression="execution(* com.mulin.demo.service.*.*(..))"
id="pointCut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/>
</aop:config>
dao:其他dao都是类似的
@Repository
public class OrderDaoImpl implements OrderDao {
@Autowired
private SessionFactory sessionFactory;
public Session getSession() {
return sessionFactory.getCurrentSession();
}
@Override
public int addOrder(Order order) {
String sql = "INSERT INTO orders(ORDER_NAME,ORDER_DATE,USER_ID) "
+"VALUES(?,?,?) ";
Query query = getSession().createSQLQuery(sql)
.setString(0, order.getOrderName())
.setDate(1, order.getOrderDate())
.setInteger(2, order.getUser().getUserId());
return query.executeUpdate();
}
@Override
public int deleteOrder(Integer userId) {
// TODO Auto-generated method stub
return 0;
}
@Override
public long countOrder() {
// TODO Auto-generated method stub
return 0;
}
@Override
public Order getOrder(Integer orderId) {
String hql = "FROM Order o "
+"WHERE o.orderId = ? ";
return (Order) getSession().createQuery(hql).setInteger(0, orderId)
.uniqueResult();
}
@SuppressWarnings("unchecked")
@Override
public List<Order> getAllOrder(User user) {
String hql = "FROM Order o "
+"WHERE o.user = ? ";
return getSession().createQuery(hql).setEntity(0, user)
.list();
}