Java-无限递归与Jackson JSON和Hibernate JPA问题

尝试将具有双向关联的JPA对象转换为JSON时,我不断

org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError)

我所发现的只是该线程,基本上以建议避免双向关联为结尾。有谁知道这个Spring错误的解决方法?

代码段:

业务对象1:

@Entity

@Table(name = "ta_trainee", uniqueConstraints = {@UniqueConstraint(columnNames = {"id"})})

public class Trainee extends BusinessObject {

@Id

@GeneratedValue(strategy = GenerationType.TABLE)

@Column(name = "id", nullable = false)

private Integer id;

@Column(name = "name", nullable = true)

private String name;

@Column(name = "surname", nullable = true)

private String surname;

@OneToMany(mappedBy = "trainee", fetch = FetchType.EAGER, cascade = CascadeType.ALL)

@Column(nullable = true)

private Set<BodyStat> bodyStats;

@OneToMany(mappedBy = "trainee", fetch = FetchType.EAGER, cascade = CascadeType.ALL)

@Column(nullable = true)

private Set<Training> trainings;

@OneToMany(mappedBy = "trainee", fetch = FetchType.EAGER, cascade = CascadeType.ALL)

@Column(nullable = true)

private Set<ExerciseType> exerciseTypes;

public Trainee() {

super();

}

... getters/setters ...

业务对象2:

import javax.persistence.*;

import java.util.Date;

@Entity

@Table(name = "ta_bodystat", uniqueConstraints = {@UniqueConstraint(columnNames = {"id"})})

public class BodyStat extends BusinessObject {

@Id

@GeneratedValue(strategy = GenerationType.TABLE)

@Column(name = "id", nullable = false)

private Integer id;

@Column(name = "height", nullable = true)

private Float height;

@Column(name = "measuretime", nullable = false)

@Temporal(TemporalType.TIMESTAMP)

private Date measureTime;

@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)

@JoinColumn(name="trainee_fk")

private Trainee trainee;

控制器:

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;

import javax.validation.ConstraintViolation;

import java.util.*;

import java.util.concurrent.ConcurrentHashMap;

@Controller

@RequestMapping(value = "/trainees")

public class TraineesController {

final Logger logger = LoggerFactory.getLogger(TraineesController.class);

private Map<Long, Trainee> trainees = new ConcurrentHashMap<Long, Trainee>();

@Autowired

private ITraineeDAO traineeDAO;

/**

* Return json repres. of all trainees

*/

@RequestMapping(value = "/getAllTrainees", method = RequestMethod.GET)

@ResponseBody

public Collection getAllTrainees() {

Collection allTrainees = this.traineeDAO.getAll();

this.logger.debug("A total of " + allTrainees.size() + " trainees was read from db");

return allTrainees;

}

}

JPA实施学员DAO:

@Repository

@Transactional

public class TraineeDAO implements ITraineeDAO {

@PersistenceContext

private EntityManager em;

@Transactional

public Trainee save(Trainee trainee) {

em.persist(trainee);

return trainee;

}

@Transactional(readOnly = true)

public Collection getAll() {

return (Collection) em.createQuery("SELECT t FROM Trainee t").getResultList();

}

}

persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"

version="1.0">

<persistence-unit name="RDBMS" transaction-type="RESOURCE_LOCAL">

<exclude-unlisted-classes>false</exclude-unlisted-classes>

<properties>

<property name="hibernate.hbm2ddl.auto" value="validate"/>

<property name="hibernate.archive.autodetection" value="class"/>

<property name="dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>

<!-- <property name="dialect" value="org.hibernate.dialect.HSQLDialect"/> -->

</properties>

</persistence-unit>

</persistence>

回答:

你可以使用它@JsonIgnore来打破循环。

以上是 Java-无限递归与Jackson JSON和Hibernate JPA问题 的全部内容, 来源链接: utcz.com/qa/423867.html

回到顶部