2017-03-23 54 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

與上述建議的變化:(。 –