Java 避免多次循环的Spring Roo

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

我试图捕捉一个简单的@manytomy关系,但我一直遇到一个无限循环的问题

我有三门课:个人课,议题课,议题课

每个人都可以在任何问题上有自己的立场,也可以在不同问题上有自己的立场。位置就像是对中立的

问题是诸如增加税收建设一所新学校之类的事情

现在我在Person类中有:

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