Java 避免多次循环的Spring Roo
我试图捕捉一个简单的@manytomy关系,但我一直遇到一个无限循环的问题 我有三门课:个人课,议题课,议题课 每个人都可以在任何问题上有自己的立场,也可以在不同问题上有自己的立场。位置就像是对中立的 问题是诸如增加税收建设一所新学校之类的事情 现在我在Person类中有:Java 避免多次循环的Spring Roo,java,hibernate,jpa,spring-roo,Java,Hibernate,Jpa,Spring Roo,我试图捕捉一个简单的@manytomy关系,但我一直遇到一个无限循环的问题 我有三门课:个人课,议题课,议题课 每个人都可以在任何问题上有自己的立场,也可以在不同问题上有自己的立场。位置就像是对中立的 问题是诸如增加税收建设一所新学校之类的事情 现在我在Person类中有: @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "person", fetch = FetchType.EAGER) @Fetch
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "person", fetch = FetchType.EAGER)
@Fetch(FetchMode.SUBSELECT)
private List<IssuePosition> issuePositions = new ArrayList<IssuePosition>();
这会导致调用load the Person以加载IssuePositions,后者加载IssuePositions,后者加载IssuePositions,后者加载Person
我该怎么阻止这一切?我已经删除了fetch=FetchType.EAGER,但这没有任何帮助。教程提供了一个很好的示例,说明如何使用@manytomy注释使用@JoinTable映射关系。一个稍微复杂一点的例子。我尝试了您的实现,它运行良好,我有以下几点
@Entity
public class IssuePosition {
@Id
private int id;
@ManyToOne(optional = true)
private Issue issue;
@ManyToOne(optional = true)
private Person person;
@Override
public String toString() {
return "IssuePosition [id=" + id + "]";
}
}
@Entity
public class Person {
@Id
private int id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "person", fetch = FetchType.EAGER)
@Fetch(FetchMode.SUBSELECT)
private List<IssuePosition> issuePositions = new ArrayList<IssuePosition>();
@Override
public String toString() {
return "Person [id=" + id + ", issuePositions=" + issuePositions + "]";
}
}
@Entity
public class Issue {
@Id
private int id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "issue", fetch = FetchType.EAGER)
private List<IssuePosition> issuePositions = new ArrayList<IssuePosition>();
@Override
public String toString() {
return "Issue [id=" + id + ", issuePositions=" + issuePositions + "]";
}
}
我得到了这个
休眠:从person0中选择person0.id作为id1\u 2\u 0\u
person0.id=?休眠:选择issueposit0\u.person\u id作为
人员3_2_2_,issueposit0_.id为id1_1_2_,issueposit0_.id为
id1_1_1_,issueposit0_。issue_id作为issue2_1_1_,issueposit0_。个人_id
作为人员3_1_1_,从IssuePosition以id1_0_0_身份发布1_.id
issueposit0_uu0左外部联接问题1_uu0开
issueposit0.issue\u id=issue1\u.id,其中issueposit0.person\u id=?
休眠:选择issueposit0。issue\u id作为issue2\u 0\u 2\u,
issueposit0.id为id1_1_2_,issueposit0.id为id1_1_1_,
issueposit0。issue_id为issue2_1_1,issueposit0。person_id为
IssuePosition issueposit0中的person3_1_1_,person1_.id为id1_2_0__
左外部联接人员person1_u在issueposit0_u.Person_uID=person1_u.id上
其中issueposit0.issue\u id=?休眠:选择issueposit0。issue\u id
作为issue2_0_2_,issueposit0_.id作为id1_1_2_,issueposit0_.id作为
id1_1_1_,issueposit0_。issue_id作为issue2_1_1_,issueposit0_。个人_id
作为IssuePosition中的person3_1_1_,person1_.id作为id1_2_0_
issueposit0_uu0左外连接人员1_uu0开
issueposit0.person\u id=person1.id,其中issueposit0.issue\u id=?
休眠:选择issueposit0。issue\u id作为issue2\u 0\u 2\u,
issueposit0.id为id1_1_2_,issueposit0.id为id1_1_1_,
issueposit0。issue_id为issue2_1_1,issueposit0。person_id为
IssuePosition issueposit0中的person3_1_1_,person1_.id为id1_2_0__
左外部联接人员person1_u在issueposit0_u.Person_uID=person1_u.id上
其中issueposit0.issue\u id=?休眠:选择issueposit0\u.person\u id
作为person3_2_2_,issueposit0_.id作为id1_1_2_,issueposit0_.id作为
id1_1_1_,issueposit0_。issue_id作为issue2_1_1_,issueposit0_。个人_id
作为人员3_1_1_,从IssuePosition以id1_0_0_身份发布1_.id
issueposit0_uu0左外部联接问题1_uu0开
issueposit0\u.issue\u id=issue1\u.id,其中issueposit0\u.person\u id位于
从IssuePosition issueposit0左外部联接中选择person1.id
Person person1_uon issueposit0_u.Person_uID=person1_u.id,其中
issueposit0。issue_id=
个人[id=1,发行位置=[IssuePosition[id=1,issue=issue[id=1]],发行位置[id=2,issue=issue[id=2]],发行位置[id=3,issue=issue[id=3]]
它似乎正在工作,您是否使用getter或setter来打印某些内容,这可能会使流程进入无限循环。检查toString或任何其他方法是否未启动流程以生成循环
@ManyToOne(optional = true)
private Issue issue;
@ManyToOne(optional = true)
private Person person;
@Entity
public class IssuePosition {
@Id
private int id;
@ManyToOne(optional = true)
private Issue issue;
@ManyToOne(optional = true)
private Person person;
@Override
public String toString() {
return "IssuePosition [id=" + id + "]";
}
}
@Entity
public class Person {
@Id
private int id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "person", fetch = FetchType.EAGER)
@Fetch(FetchMode.SUBSELECT)
private List<IssuePosition> issuePositions = new ArrayList<IssuePosition>();
@Override
public String toString() {
return "Person [id=" + id + ", issuePositions=" + issuePositions + "]";
}
}
@Entity
public class Issue {
@Id
private int id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "issue", fetch = FetchType.EAGER)
private List<IssuePosition> issuePositions = new ArrayList<IssuePosition>();
@Override
public String toString() {
return "Issue [id=" + id + ", issuePositions=" + issuePositions + "]";
}
}
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaQuery");
EntityManager em = emf.createEntityManager();
Person p = em.find(Person.class, 1);
System.out.println(p);