【问题标题】:Hibernate/Jpa OneToMany not retrieving data properlyHibernate/Jpa OneToMany 无法正确检索数据
【发布时间】:2014-07-22 12:50:05
【问题描述】:

我有一个名为 User 的实体类,其中包含数据库的 OneToMany 列:

  @Setter
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
    @JoinTable(
        name = "USER_CARS",
        joinColumns = @JoinColumn(name="USER_ID", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name="CAR_ID", referencedColumnName = "id")
    )
    private List<Car> cars;

当我将用户插入数据库时​​,一切正常,并且他的汽车也添加到 user_cars 表中。检索汽车时,我得到了这个异常:

Method threw 'org.hibernate.LazyInitializationException' exception.

我已经搜索了其他答案,但没有找到解决方法。这就是我试图检索用户的方式。

public T findById(Long id) {
    em = emf.createEntityManager();
    em.getTransaction().begin();

    T et = (T) em.find(entityClass, id);

    em.getTransaction().commit();
    em.close();

    return et;
}

有什么问题,我该如何解决?我不明白后台发生了什么。

【问题讨论】:

  • 您可以先在@OneToMany 注解中使用fetch = FetchType.EAGER 进行测试。多方面的默认获取类型为Lazy。我认为您必须使用Hibernate.initialize() 方法在交易边界中初始化与用户相关的所有汽车。请参阅herehere 了解更多详情。
  • 你究竟是什么时候得到这个异常的?当session 不再可用时,当您尝试访问延迟加载的属性时,您会看到它。您可能希望将其作为预加载的替代方法。
  • 尝试在检索到的数据中查看用户汽车时会出现此异常(在调试时)。

标签: java hibernate jpa hibernate-onetomany


【解决方案1】:

根据异常消息,您似乎正在检索List 汽车的内容,但EntityManager 会话已经关闭。而不是您可以使用的集合的默认延迟初始化

@OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.EAGER)

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 2014-07-12
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多