这就是我被困的地方:
javax.servlet.ServletException: org.hibernate.LazyInitializationException:懒得初始化 角色集合:it.trew.model.TipoCaratteristica.traduzioni,no 会议或会议已经结束
我的一些实体代码:
@Entity
@Table(name = "tipi_caratteristiche")
public class TipoCaratteristica implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
private String nome;
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "tipi_caratteristiche_traduzioni",
joinColumns = { @JoinColumn(name = "tipo_caratteristica_id") },
inverseJoinColumns = { @JoinColumn(name = "traduzione_id") }
)
private List<Traduzione> traduzioni = new ArrayList<Traduzione>();
“Traduzione”是一个简单的普通实体,具有一对String属性。
我有一个“编辑”jsf页面,它通过id加载“TipoCaratteristica”并尝试在标签中显示其列表。
我使用ejb-facade方法来获取已编辑的对象:
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
然后,在jsf支持bean中:
TipoCaratteristica tc = ejbFacade.find(Long.valueOf(value));
我读了一些关于那个例外的事情。实际上,在“traduzioni”集合上设置获取类型EAGER可以修复它,但我不想这样做。 我读过在事务中执行所有操作,或使用Hibernate.initialize(),但不知道如何执行此操作。
你能帮我吗?
答案 0 :(得分:2)
@Override
public TipoCaratteristica find(Object id) {
TipoCaratteristica result = super.find(id);
Hibernate.initialize(result.getTraduzioni());
return result;
}
或者不使用em.find()
,而是使用将加载所有内容的查询作为单个查询:
select distinct tc from TipoCaratteristica
left join fetch tc.traduzioni
where tc.id = :id
答案 1 :(得分:2)
您可以使用实体管理器中的PersistentContext.EXTENDED
属性解决此问题。
示例:
@PersistentContext(type=PersistentContext.EXTENDED)
private EntityManager em;
或更新版本:
@PersistentContext(type=PersistentContextType.EXTENDED)
private EntityManager em;
发生此错误是因为对于实体管理器事务关闭的每个事务,此属性都会避免这种情况并允许实体管理器保持可用。你可以阅读更多细节阅读Dan Allen的行动书中的Seam,他详细解释了这个问题。