![](/img/trans.png)
[英]LazyInitializationException with ModelMapper (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.