我有一個簡單的@OneToMany關係的兩個對象看起來如下:春季啓動JPA - 一對多關係導致無限循環
父:
@Entity
public class ParentAccount {
@Id
@GeneratedValue
private long id;
private String name;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "parentAccount")
private Set<LinkedAccount> linkedAccounts;
}
孩子:
@Entity
public class LinkedAccount {
@Id
@GeneratedValue
private long id;
@ManyToOne(optional = false)
private ParentAccount parentAccount;
private String name;
// empty constructor for JPA
public LinkedAccount() {
}
}
我ma使用Spring CrudRepository
來操作這些實體。但是,調用ParentAccount parent = parentAccountRepository.findOne(id);
時,某種無限循環的開始發生,冬眠垃圾郵件這遍控制檯:
Hibernate: select linkedacco0_.parent_account_id as parent_a6_1_0_, linkedacco0_.id as id1_0_0_, linkedacco0_.id as id1_0_1_, linkedacco0_.aws_id as aws_id2_0_1_, linkedacco0_.key_id as key_id3_0_1_, linkedacco0_.name as name4_0_1_, linkedacco0_.parent_account_id as parent_a6_0_1_, linkedacco0_.secret_key as secret_k5_0_1_ from linked_account linkedacco0_ where linkedacco0_.parent_account_id=?
我試着改變了獲取類型LAZY但後來我得到這個錯誤:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.berrycloud.scheduler.model.ParentAccount.linkedAccounts, could not initialize proxy - no Session
(似乎它試圖在事務上下文之外執行延遲加載)。
這是我的CRUD庫:
@Repository
public interface ParentAccountRepository extends CrudRepository<ParentAccount, Long> {
}
有人能告訴我如何解決這個問題?我更喜歡EAGER獲取的解決方案。感謝您的任何提示
編輯:這是我使用
CREATE TABLE parent_account (
id BIGINT auto_increment,
name VARCHAR(80) null,
PRIMARY KEY (`id`)
);
CREATE TABLE linked_account (
id BIGINT auto_increment,
parent_account_id BIGINT,
name VARCHAR(80) null,
FOREIGN KEY (`parent_account_id`) REFERENCES `parent_account` (`id`),
PRIMARY KEY (`id`)
);
那麼,每個父帳戶有幾個鏈接的帳戶。而已。我沒有看到這可以解析成樹圖。深度應該是1. – Smajl
在您的映射或模式中沒有錯誤...我不認爲您的無限循環問題來自...您是否在做這些對象中的其他任何事情?一些JSON/Jackson註釋可能? – Pras