java 将Hibernate对象列表放入JSON对象

jecbmhm3  于 2022-11-27  发布在  Java
关注(0)|答案(1)|浏览(144)

I want to add a list of Hibernate objects into a JSON object but I get StackOverflowError .
I also tried @JsonBackReference("mamRequestHeaders.mamRequestLinesSet") in MAMRequestLine.java and @JsonManagedReference("mamRequestHeaders.mamRequestLinesSet") in MAMRequestHeader.java but the problem was not resolved.
java.lang.StackOverflowError at java.lang.reflect.InvocationTargetException.(InvocationTargetException.java:72) at sun.reflect.GeneratedMethodAccessor494.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.json.JSONObject.populateMap(JSONObject.java:988) at org.json.JSONObject.(JSONObject.java:272) at org.json.JSONObject.wrap(JSONObject.java:1587) at org.json.JSONArray.(JSONArray.java:158) at org.json.JSONObject.wrap(JSONObject.java:1569) at org.json.JSONObject.populateMap(JSONObject.java:990) at org.json.JSONObject.(JSONObject.java:272) at org.json.JSONObject.wrap(JSONObject.java:1587) at org.json.JSONObject.populateMap(JSONObject.java:990)

MAMRequestHeaders class

@Entity(name="MAMRequestHeaders")
@Table(name = "MAM_REQUEST_HEADERS", uniqueConstraints = @UniqueConstraint(columnNames = {"REQUEST_TYPE", "NUM_REQUEST_MREQH"}))
public class MAMRequestHeaders  implements Serializable {

    private long id ;
    private Set<MAMRequestLines> mamRequestLinesSet;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MAM_REQUEST_HEADERS_SEQ")
    @SequenceGenerator(name = "MAM_REQUEST_HEADERS_SEQ", sequenceName = "MAM_REQUEST_HEADERS_SEQ")
    @Column(name = "REQUEST_HEADER_ID")
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @OneToMany(mappedBy = "mamRequestHeaders", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @OnDelete(action = OnDeleteAction.CASCADE)
    public Set<MAMRequestLines> getMamRequestLinesSet() {
        return mamRequestLinesSet;
    }

    public void setMamRequestLinesSet(Set<MAMRequestLines> mamRequestLinesSet) {
        this.mamRequestLinesSet = mamRequestLinesSet;
    }

}

MAMRequestLines class

@Entity(name = "MAMRequestLines")
@Table(name = "MAM_REQUEST_LINES", uniqueConstraints = @UniqueConstraint(columnNames = {"REQUEST_HEADER_ID", "NUM_LINE_MREQL"}))
public class MAMRequestLines implements Serializable {

    private Long id;
    @JsonIgnore
    private MAMRequestHeaders mamRequestHeaders;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MAM_REQUEST_Line_SEQ")
    @SequenceGenerator(name = "MAM_REQUEST_Line_SEQ", sequenceName = "MAM_REQUEST_Line_SEQ")
    @Column(name = "REQUEST_LINE_ID")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "REQUEST_HEADER_ID", nullable = false)
    public MAMRequestHeaders getMamRequestHeaders() {
        return mamRequestHeaders;
    }

    public void setMamRequestHeaders(MAMRequestHeaders mamRequestHeaders) {
        this.mamRequestHeaders = mamRequestHeaders;
    }

}

Creating result

List<MAMRequestHeaders> mamRequestHeadersList =  manager.createQuery(queryStr, MAMRequestHeaders.class)
JSONObject result = new JSONObject();
result.put("resultList", mamRequestHeadersList);
kgsdhlau

kgsdhlau1#

@OneToMany集合中添加@JsonManagedReference,在@ManyToOne域中添加@JsonBackReference。请参阅下面更新的示例。

MAMRequestHeaders

@Entity(name="MAMRequestHeaders")
@Table(name = "MAM_REQUEST_HEADERS", uniqueConstraints = @UniqueConstraint(columnNames = {"REQUEST_TYPE", "NUM_REQUEST_MREQH"}))
public class MAMRequestHeaders  implements Serializable {

    private long id;

    @JsonBackReference
    private Set<MAMRequestLines> mamRequestLinesSet;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MAM_REQUEST_HEADERS_SEQ")
    @SequenceGenerator(name = "MAM_REQUEST_HEADERS_SEQ", sequenceName = "MAM_REQUEST_HEADERS_SEQ")
    @Column(name = "REQUEST_HEADER_ID")
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @OneToMany(mappedBy = "mamRequestHeaders", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @OnDelete(action = OnDeleteAction.CASCADE)
    public Set<MAMRequestLines> getMamRequestLinesSet() {
        return mamRequestLinesSet;
    }

    public void setMamRequestLinesSet(Set<MAMRequestLines> mamRequestLinesSet) {
        this.mamRequestLinesSet = mamRequestLinesSet;
    }

}

MAMRequestLines

@Entity(name = "MAMRequestLines")
@Table(name = "MAM_REQUEST_LINES", uniqueConstraints = @UniqueConstraint(columnNames = {"REQUEST_HEADER_ID", "NUM_LINE_MREQL"}))
public class MAMRequestLines implements Serializable {

    private Long id;

    @JsonManagedReference
    private MAMRequestHeaders mamRequestHeaders;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MAM_REQUEST_Line_SEQ")
    @SequenceGenerator(name = "MAM_REQUEST_Line_SEQ", sequenceName = "MAM_REQUEST_Line_SEQ")
    @Column(name = "REQUEST_LINE_ID")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "REQUEST_HEADER_ID", nullable = false)
    public MAMRequestHeaders getMamRequestHeaders() {
        return mamRequestHeaders;
    }

    public void setMamRequestHeaders(MAMRequestHeaders mamRequestHeaders) {
        this.mamRequestHeaders = mamRequestHeaders;
    }

}

但是实际上JSON注解的配置取决于你想要的输出,例如你也可以把@JsonIgnore放在MAMRequestLines类的getMamRequestHeaders()上。

相关问题