删除双向递归关系的最简单方法是什么?

我使用Gson库将Java对象转换为Json响应…问题是,在JPA请求之后,由于与其他实体的递归关系而无法转换从DB检索的对象( 请参阅我之前的问题 ),例如:

public class Gps implements Serializable { private static final long serialVersionUID = 1L; @Id @Basic(optional = false) @Column(name = "IMEI", nullable = false, length = 20) private String imei; //some code here... @OneToMany(cascade = CascadeType.ALL, mappedBy = "gpsImei", fetch = FetchType.LAZY) private List coordonneesList; public class Coordonnees implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "IDCOORDONNEES", nullable = false) private Integer idcoordonnees; //some code here... @JoinColumn(name = "GPS_IMEI", referencedColumnName = "IMEI", nullable = false) @ManyToOne(optional = false, fetch = FetchType.LAZY) private Gps gpsImei; 

我的源代码:

  EntityManagerFactory emf=Persistence.createEntityManagerFactory("JavaApplication21PU"); GpsJpaController gjc=new GpsJpaController(emf); Gps gps=gjc.findGps("123456789012345"); for(int i=0;i<gps.getCoordonneesList().size();i++){ gps.getCoordonneesList().get(i).setGpsImei(null); } Gson gson=new Gson(); String json=gson.toJson(gps);//convert to json response System.out.println(json); 

正如你在这里看到我做的:

  for(int i=0;i<gps.getCoordonneesList().size();i++){ gps.getCoordonneesList().get(i).setGpsImei(null); } 

只能通过为coordonneesList中的每个GPS对象设置null来终止递归关系。

在您看来,这是一个很好的解决方案还是有其他方法更实用? 谢谢

有一个名为GraphAdapterBuilder的Gson扩展,可以序列化包含循环引用的对象。 以下是相应测试用例的一个非常简单的示例:

 Roshambo rock = new Roshambo("ROCK"); Roshambo scissors = new Roshambo("SCISSORS"); Roshambo paper = new Roshambo("PAPER"); rock.beats = scissors; scissors.beats = paper; paper.beats = rock; GsonBuilder gsonBuilder = new GsonBuilder(); new GraphAdapterBuilder() .addType(Roshambo.class) .registerOn(gsonBuilder); Gson gson = gsonBuilder.create(); System.out.println(gson.toJson(rock)); 

这打印:

 { '0x1': {'name': 'ROCK', 'beats': '0x2'}, '0x2': {'name': 'SCISSORS', 'beats': '0x3'}, '0x3': {'name': 'PAPER', 'beats': '0x1'} } 

请注意,GraphAdapterBuilder类包含在gson.jar中。 如果要使用它,则必须手动将其复制到项目中。

我和Gson不知道,但我和jackson一起工作。 查找使用其ObjectMapper类的示例。 至于递归,使用@JsonManagedReference和@JsonBackReference来阻止它。 看看那些例如用法。

您可以使用@Expose(serialize = false)来避免Collection被序列化。

使用transient来忽略google.gson的@OneToMany集