【发布时间】:2015-02-24 17:51:21
【问题描述】:
在将我的酒店实体持久保存到后端 (mysql) 后,任何下一个前端客户端调用以刷新设备列表(酒店中的集合)都会遇到此错误(即使我将集合标记为急切地获取):
懒惰初始化集合失败,没有会话或会话 关闭了
前端的托管 bean(使用 JSF):
public void save() {
hotel.setHotelUser(loginBean.getLoggedInUser());
hotel = hopAccess.persistHotel(hotel);
addMessage("Hotel saved!");
}
实体:
@Entity
@Table(name = "hotel")
public class Hotel {
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "con_hotel_equipment", joinColumns = {
@JoinColumn(name = "id_hotel", nullable = false, updatable = false) },
inverseJoinColumns = { @JoinColumn(name = "id_lookup",
nullable = false, updatable = false) })
private Set<LookUp> equipments = new HashSet<LookUp>();
服务:
@Override
@Transactional(value = "transactionManagerHop", propagation = Propagation.REQUIRES_NEW)
public Hotel persistHotel(Hotel hotel) {
Hotel entity = emHop.merge(hotel);
addToCache(entity);
return entity;
}
【问题讨论】:
-
这不是 JSF 问题。您可能正在尝试获取应该在 Hibernate 端延迟初始化的集合(此处为
wizzardBean.hotel.equipments)。使用FetchType.EAGER,这反过来又被严重劝阻,使用适当的 fetch join(s) 或使用一些供应商特定的配置(我个人不喜欢)。 -
谢谢,但请检查我的代码 - 我已经急切地获取收藏。
-
是的,但它可能潜伏在其他地方。答案将在抛出的完整异常堆栈跟踪中。
-
尝试将属性
collectionType="java.util.ArrayList"添加到selectCheckboxMenu -
这将导致映射问题,因为 hotel.equipments 是 Set 类型。
标签: hibernate jpa lazy-initialization