2017-03-23 25 views
1

我有一个2实体classes.Employee和账户异常而从JPA读取数据 - org.hibernate.LazyInitializationException

@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; 
} 

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

我尝试过使用FetchType.EAGER for OnetoMany,但没有运气。不知道是否它的lombok @Data(toString())导致问题。

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

请大家帮忙。

+0

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

回答

0

你可能需要将以下注释添加到Employee

@ToString(exclude="accounts") 

另外,我觉得你要根据自己的ID添加基地两个实体的平等:

@EqualsAndHashCode(of="emp_id") 

而且东西类似于Account

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

+0

与上述建议的变化:(。 –