繁体   English   中英

LazyInitializationException Spring和Hibernate

[英]LazyInitializationException Spring and Hibernate

我收到此异常,嵌套的异常是org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.ibm.ro.model.Location.subLocations, could not initialize proxy - no Session.

我确实在访问该集合时就知道事务已关闭,这就是代码抛出此异常的原因。 这是我的示例代码

@Entity
@Table(name="location")
public class Location extends BaseEntity {

    private static final long serialVersionUID = 1L;

    private String name;
    private List<Location> subLocations;
    private Location location;

    @Column(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "location")
    public List<Location> getSubLocations() {
        return subLocations;
    }
    public void setSubLocations(List<Location> subLocations) {
        this.subLocations = subLocations;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    public Location getLocation() {
        return location;
    }
    public void setLocation(Location location) {
        this.location = location;
    }

    @Override
    public String toString() {
        return "Location [name=" + name + ", subLocations=" + subLocations
            + "]";
    }

}

这是我的DAO:

@Repository("locationDao")
public class LocationDao implements ILocationDao{

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public List<Location> getAll() {
        Session sess = getSession();
        return sess.createCriteria(Location.class).setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY).list();
    }
}

这是我的服务:

@Service("locationService")
@Transactional
public class LocationService implements ILocationService{

    @Autowired
    ILocationDao dao;

    @Override
    public List<Location> getAll() {
        return dao.getAll();
    }
}

这是引发异常的控制器:

@Controller
public class BaseController {

    @Autowired
    ILocationService service;

    private static final String VIEW_INDEX = "index";
    private final static org.slf4j.Logger logger =    LoggerFactory.getLogger(BaseController.class);

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String location(ModelMap model) {        
    logger.debug(service.getAll().toString());
        return VIEW_INDEX;
    }
}

不使用OpenSessionInViewFilter怎么办才能解决问题?

您可以在服务(您仍有交易的地方)中迭代Location,并在元素上调用Hibernate.initialize ,以强制初始化持久性集合。

    @Override
    public List<Location> getAll() {
        List<Location> locations = dao.getAll();
        for (Location location : locations ) { 
          Hibernate.intialize(location.getSubLocations())
        }
        return locations;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM