Używam biblioteki Gson do konwersji obiektów Java na odpowiedź Json ... Problem polega na tym, że po żądaniach JPA obiekt pobrany z DB nie może zostać przekonwertowany z powodu rekurencyjnej relacji z innymi jednostkami (see my previous question), na przykład:Najprostszym sposobem na usunięcie dwukierunkowych relacji rekurencyjnych?
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;
Mój kod źródłowy:
EntityManagerFactory emf=Persistence.createEntityManagerFactory("JavaApplication21PU");
GpsJpaController gjc=new GpsJpaController(emf);
Gps gps=gjc.findGps("123456789");
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);
Jak widać tutaj zrobiłem:
for(int i=0;i<gps.getCoordonneesList().size();i++){
gps.getCoordonneesList().get(i).setGpsImei(null);
}
tylko po to, aby zniszczyć relację rekursywną, ustawiając wartość null dla każdego obiektu GPS w katalogu coordonneesList.
Czy Twoim zdaniem jest to dobre rozwiązanie, czy jest jeszcze inna praktyczna metoda? Dzięki
Dzięki! To był ratownik podczas pracy ze stanem hibernacji. Zaoszczędził mnóstwa kłopotów przy konwertowaniu elementu hibernacji za pomocą gson. – Knubo
działa również na Androidzie. –
który jar zawiera tę klasę "GraphAdapterBuilder"? – pavan