Note that there are some explanatory texts on larger screens.

plurals
  1. POInfinite Recursion with Jackson JSON and Hibernate JPA issue
    text
    copied!<p>When trying to convert a JPA object that has a bi-directional association into JSON, I keep getting </p> <pre><code>org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError) </code></pre> <p>All I found is <a href="http://forum.springsource.org/showthread.php?t=88803" rel="noreferrer">this thread</a> which basically concludes with recommending to avoid bi-directional associations. Does anyone have an idea for a workaround for this spring bug?</p> <p>------ EDIT 2010-07-24 16:26:22 -------</p> <p>Codesnippets:</p> <p>Business Object 1:</p> <pre><code>@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&lt;BodyStat&gt; bodyStats; @OneToMany(mappedBy = "trainee", fetch = FetchType.EAGER, cascade = CascadeType.ALL) @Column(nullable = true) private Set&lt;Training&gt; trainings; @OneToMany(mappedBy = "trainee", fetch = FetchType.EAGER, cascade = CascadeType.ALL) @Column(nullable = true) private Set&lt;ExerciseType&gt; exerciseTypes; public Trainee() { super(); } ... getters/setters ... </code></pre> <p>Business Object 2:</p> <pre><code>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; </code></pre> <p>Controller:</p> <pre><code>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&lt;Long, Trainee&gt; trainees = new ConcurrentHashMap&lt;Long, Trainee&gt;(); @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; } } </code></pre> <p>JPA-implementation of the trainee DAO:</p> <pre><code>@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(); } } </code></pre> <p>persistence.xml</p> <pre><code>&lt;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"&gt; &lt;persistence-unit name="RDBMS" transaction-type="RESOURCE_LOCAL"&gt; &lt;exclude-unlisted-classes&gt;false&lt;/exclude-unlisted-classes&gt; &lt;properties&gt; &lt;property name="hibernate.hbm2ddl.auto" value="validate"/&gt; &lt;property name="hibernate.archive.autodetection" value="class"/&gt; &lt;property name="dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/&gt; &lt;!-- &lt;property name="dialect" value="org.hibernate.dialect.HSQLDialect"/&gt; --&gt; &lt;/properties&gt; &lt;/persistence-unit&gt; &lt;/persistence&gt; </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload