【问题标题】:Exception while reading data from JPA - org.hibernate.LazyInitializationException从 JPA 读取数据时出现异常 - org.hibernate.LazyInitializationException
【发布时间】:2017-03-23 17:58:43
【问题描述】:

我有 2 个实体类。Employee 和 Account

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@DynamicUpdate
@DynamicInsert
@Table(name = "employee", schema = "org")
public class Employee {
@Id
@Column(name = "emp_id")
private String empId;

@Column(name = "emp_name")
private String empName;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "employee")
private Set<Account> accounts;
}

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@DynamicUpdate
@DynamicInsert
@Table(name = "account", schema = "org")
public class Account {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "acct_id")
private Integer accountId;

@Column(name = "acct_nbr")
private String accountNumber;

@ManyToOne
@JoinColumn(name = "emp_id", nullable = false)
private Employee employee;
}

我能够将数据保存到数据库,但是在检索员工行时,我得到“Method throw 'org.hibernate.LazyInitializationException' exception。无法评估 Employee.toString()”,并且对于员工对象(帐户)中的集合我看到“无法评估表达式方法抛出 org.hibernate.LazyInitializationException' 异常。

我已经尝试过使用 FetchType.EAGER for OnetoMany 但是没有运气。不确定它是否是 lombok @Data(toString()) 引起的问题。

PS:我使用 JPA CrudRepository 来保存和检索数据库中的数据。

请帮忙。

【问题讨论】:

  • 一个问题是您对 toString 有循环依赖关系,如果它试图通过打印检索到的对象来记录它们,这可能会导致问题。如果您在帐户上调用 toString,它将在其拥有的员工上调用 toString,该员工将在包含它的所有帐户上调用 toString,这将再次在自身上调用 toString,像这样循环直到它耗尽内存。另外,你能提供一个堆栈跟踪吗?

标签: hibernate jpa spring-boot lombok


【解决方案1】:

您可能需要在Employee 中添加以下注解:

@ToString(exclude="accounts")

另外,我认为您想根据两个实体的 id 添加基本相等性:

@EqualsAndHashCode(of="emp_id")

还有类似于Account的东西

披露:我是龙目岛开发人员。

【讨论】:

  • 以上建议的更改不走运:( .
  • 这对我在集成测试中解决我的实体对 toString() 的循环依赖很有帮助。需要注意的一件事是“帐户”,这两个都在实体级别。当已经使用 @Data 注释时,是否有推荐的方法来覆盖 toString() 行为?
猜你喜欢
  • 1970-01-01
  • 2013-04-30
  • 2016-08-24
  • 1970-01-01
  • 2022-10-19
  • 2014-10-20
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多