【问题标题】:org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:ticketCircuitInfo, could not initialize proxy - no Sessionorg.hibernate.LazyInitializationException:未能延迟初始化角色集合:ticketCircuitInfo,无法初始化代理 - 无会话
【发布时间】:2019-03-13 23:36:55
【问题描述】:

我有 2 个 bean 类(ticketEntityticketCircuitInfo)分别映射到 1 个表

我还有 1 个ticketEntity(primary key) 可以有多个ticketCircuitInfo(forign key)

ticketEntity bean 具有以下属性:

@Id
@Column(name = "ticket_id", unique = true, nullable = false)
private String ticketId;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "ticket", cascade      =CascadeType.ALL)
private Set<TicketCircuitInfo> ticketCircuitInfo;

ticketCircuitInfo bean 具有以下属性:

@GenericGenerator(name = "generator", strategy = "foreign",
parameters = @Parameter(name = "property", value = "ticket"))
@Id
@Column(name = "ticket_id", unique = true, nullable = false)
private String ticketId;
@ManyToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
private TicketEntity ticket;`

我明白了:

com.sun.jdi.InvocationException 发生调用方法。

调试时在线ticket.ticketCircuitInfo()

正在打印的其他异常是:

org.hibernate.LazyInitializationException: 延迟初始化角色集合失败:ticketCircuitInfo,无法初始化代理 - 没有会话

【问题讨论】:

  • 您如何连接到您的数据库以检索您的实体?发生的事情是您从数据库中取出您的实体,然后您的会话关闭。当您尝试查询 Lazy 属性时,它会因为会话不可用而失败。了解如何连接到数据库是为您提供合适解决方案的关键。

标签: java hibernate


【解决方案1】:

您应该查看您的服务层并将@Transactional 添加到服务层方法..

请参考:How to solve the “failed to lazily initialize a collection of role” Hibernate exception

【讨论】:

  • 你假设他们使用的是 Spring,但他们没有标记。错误消息只是警告会话已关闭,这可能是由许多事情引起的。我会等到 OP 澄清他们正在使用 Spring,然后再建议使用 @Transactional。另一方面,如果另一个问题也已经回答了 OP 的问题,那么最好将其标记为重复,而不是发布带有其他问题链接的答案。
【解决方案2】:

你可以改变

@ManyToOne(fetch = FetchType.LAZY)

@ManyToOne(fetch = FetchType.EAGER)

【讨论】:

  • 使关系急切加载不是解决LazyInitializationExceptions的方法
猜你喜欢
  • 2015-07-02
  • 2018-02-25
  • 2014-05-14
  • 1970-01-01
  • 2015-05-03
  • 2016-07-06
  • 2016-06-04
  • 2018-11-21
  • 2014-12-23
相关资源
最近更新 更多