Java EE 6 + Hibernate Lazy加载异常

时间:2012-05-14 08:11:25

标签: hibernate java-ee jpa ejb

这就是我被困的地方:

  

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(),但不知道如何执行此操作。

你能帮我吗?

2 个答案:

答案 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,他详细解释了这个问题。