JAX-RS JSON序列化循环与JPA实体
JAX-RS JSON序列化循环与JPA实体
我正在使用Netbeans 7.4在Glassfish 4.0上开发一个典型的Java EE 7应用程序。我有一组具有各种关系的JPA实体。由于这可能是一个众所周知的问题,当我尝试使用JAX-RS服务公开与另一个实体具有双向关系的实体时,我遇到了一个问题(最有可能是由于序列化循环引起的)。\n对于解决这个问题,我已经搜索了很多。显然,最清晰的解决方法是使用Jackson提供者而不是Jersey内置的提供者。然而,对我来说并不成功。我可能在中间做错了什么,任何提示都将不胜感激。\n第一个实体:\n@Entity\npublic class User implements Serializable {\n @Id\n private long id;\n ...\n @OneToMany(\n mappedBy = \"owner\",\n cascade = CascadeType.ALL\n )\n private List
JAX-RS JSON serialization loop with JPA entities的问题是在使用Hibernate和Jersey时,希望在Restful的JSON web服务中只检索关系的id(而不加载整个对象)。解决方法是创建一个用于id的字段,并将其忽略以进行JSON序列化。然后在ObjectDao查询中,如果需要从关系中获取parent id,则可以将parent id定义为parent_id,例如"from files WHERE user_id = parent_id"。需要在所有查询中进行这样的处理。此外,应该使用LAZY关系(否则仍会加载对象)。这是因为parent_id是对象表的一个列,所以不需要调用parent。
以上是本文对问题出现的原因和解决方法的整理。
问题的原因是Jackson在尝试序列化JPA实体对象时出现了循环引用的问题。解决方法是修改Playlist实体类,并使用Jackson的注解来解决循环引用的问题。具体的解决方法可以参考以下链接中的讨论和解决方案:
- cyclic references in a bidirectional many to many relationship: http://stackoverflow.com/questions/13630096
- how to solve circular reference in json serializer caused by hibernate bidirecti: http://stackoverflow.com/questions/3340485
- jackson confused with bidirectional one to many relationship: http://stackoverflow.com/questions/10097865
- deserializing objects with bi-directional many to many relations: http://jackson-users.ning.com/forum/topics/deserializing-objects-with-bi-directional-many-to-many-relations
- JSON troubleshooting circular dependency errors: http://ankeetmaini.wordpress.com/2012/07/26/json-troubleshooting-circular-dependency-errors/
- infinite recursion with jackson json and jpa: http://forum.spring.io/forum/spring-projects/web/81228-infinite-recursion-with-jackson-json-and-jpa
此外,还需要确保正确导入Jackson的相关库,并使用正确的注解。在这种情况下,需要下载并导入jackson-annotations库,并使用com.fasterxml.jackson.annotation.JsonIgnore注解来解决循环引用的问题。