【发布时间】:2016-01-18 23:43:12
【问题描述】:
我有两个具有简单@OneToMany 关系的对象,如下所示:
父母:
@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() {
}
}
我使用 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 fetch 的解决方案。感谢您的任何提示
编辑:这是我正在使用的架构
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。
-
您的映射或架构中没有错误...我不认为您的无限循环问题来自于此...您在这些对象中做了其他事情吗?也许是一些 JSON / Jackson 注释?
标签: java hibernate jpa spring-boot