最简单的方法来消除双向递归关系? [英] The easiest way to remove the bidirectional recursive relationships?

查看:134
本文介绍了最简单的方法来消除双向递归关系?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 Gson 库将Java对象转换为Json响应。 ..
问题是,在JPA请求之后,从DB检索的对象无法转换,因为与其他实体之间存在递归关系(

<$>

p $ p> public class Gps implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(可选= false)
@Column(name =IMEI,nullable = false,length = 20)
private String imei;
//一些代码在这里...
@OneToMany(cascade = CascadeType.ALL,mappedBy =gpsImei,fetch = FetchType.LAZY)
private List< Coordonnees> coordonneesList;


公共类Coordonnees实现了Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(可选= false)
@Column(name =IDCOORDONNEES,nullable = false)
私人Integer idcoordonnees;
//这里有一些代码...
@JoinColumn(name =GPS_IMEI,referencedColumnName =IMEI,nullable = false)
@ManyToOne(可选= false,fetch = FetchType。 LAZY)
私人Gps gpsImei;

我的源代码:

  EntityManagerFactory emf = Persistence.createEntityManagerFactory(JavaApplication21PU); 
GpsJpaController gjc = new GpsJpaController(emf);

Gps gps = gjc.findGps(123456789012345); (int i = 0; i< gps.getCoordonneesList()。size(); i ++){
gps.getCoordonneesList()。get(i).setGpsImei(null);


}

Gson gson = new Gson();
String json = gson.toJson(gps); //转换为json响应

System.out.println(json);

正如您在这里所看到的:

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

只能通过为coordonneesList中的每个GPS对象设置null来消除递归关系..



您认为这是一个很好的解决方案还是另一种更实用的方法?
Thanks

解决方案

有一个名为
GraphAdapterBuilder ,它可以序列化包含循环引用的对象。下面是相应测试用例的一个简单例子:

  Roshambo rock =新Roshambo(ROCK); 
Roshambo剪刀=新Roshambo(剪刀);
Roshambo paper =新Roshambo(PAPER);
rock.beats =剪刀;
scissors.beats =纸;
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'}
}

请注意,gson.jar中包含GraphAdapterBuilder类 not 。如果你想使用它,你必须手动将它复制到你的项目中。


I use the Gson library to convert Java objects to a Json response... the problem is that after a JPA requests the object retrieved from DB can not be converted because of a recursive relationship with other entities(see my previous question) for example :

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<Coordonnees> 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;

My source code:

  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);  

As you can see here i made :

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

only to kill the recursive relationship by setting null for each GPS object in the coordonneesList..

In your opinion this is a good solution or is there another method more practical? Thanks

解决方案

There's a Gson extension called GraphAdapterBuilder that can serialize objects that contain circular references. Here's a very simplified example from the corresponding test case:

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));

This prints:

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

Note that the GraphAdapterBuilder class is not included in gson.jar. If you want to use it, you'll have to copy it into your project manually.

这篇关于最简单的方法来消除双向递归关系?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆