2017-07-19 4 views
1

Ich habe diese Wesen, es ist nicht vom wirklichen Code, aber es ist nicht wichtig, denke ich.Get einzelnes Element von JPA verschachtelte OneToMany Beziehung

@Entity 
    public class Country{ 

     private String name; 
     //other fields with getters and setters 
     @OneToMany 
     private List<City> cites; 


    } 

    @Entity 
    public class City { 

     private String name; 
     //other fields with getters and setters 
     @OneToMany 
     private List<Employee> emps;//list size could be millions 


    } 

    @Entity 
    public class Employee { 

     private String name; 
     //other fields with getters and setters 

     @OneToMany 
     private List<Cars> cars;// list size could be 1000 

    } 


    @Entity 
    public class Car { 
     private String name; 

     @ManyToOne 
     private Employee emp; 
    } 

Ich mag einzelne Auto Einheit erhalten, aber mit anderen Daten als auch (Land, Stadt, Mitarbeiter) wie dieses

1 Land, in der 1-Stadt, in der 1 Empoyee, in der 1-Auto (die Id ich bei der Auswahl der Put)

Also, wenn ich JPA tun kommt von Land wie

select c from Country c 
inner join c.cites ci 
inner join ci.emps em 
    inner join ci.cars car where car.id = ? 

ich alle Daten in Land erhalten (mit allen Städten).

Was soll ich tun, um 1 Land, 1 Stadt, 1 Mitarbeiter, 1 Auto zu bekommen.

Wenn dies mit einer jpa-Abfrage nicht möglich ist, schlagen Sie bitte einen anderen Weg vor.

Alle Beziehungen sind bidirektional und faul.

I tried this way. 
1)select car by id. then get Id of employee from car. 
2)select Employee by id - but at this point Employee data are nulls - 

Ich denke, es liegt daran, dass ManyToOne von Auto zu Mitarbeitern faul ist. Was denken Sie ?

Antwort

2

einfach die zusätzlichen Einheiten wählen Sie:

select c, ci, em, car from Country c 
inner join c.cites ci 
inner join ci.emps em 
inner join ci.cars car where car.id = ? 

Oder, da Ihre Verbände bidirektional sind, wählen Sie das Auto: es wird eine ManyToOne seine Mitarbeiter haben, die eine ManyToOne mit seiner Stadt haben wird, die eine ManyToOne mit seinem Land haben:

select car from Car car where car.id = ? 

oder einfach

em.find(Car.class, carId); 

und jetzt können Sie tun

car.getEmployee().getCity().getCountry() 
+0

Vielen Dank. Für beide Lösungen muss ich tun. emp.setCars (Collections.sigltonlist (Auto)) city.setEmps (Collections.singletonList (emp)) country.setCiyes (Collections.singletonList (Stadt)) Ansonsten während json serializtion alle faulen Sammlungen mit Millionen bevölkert erhalten von Dateien. Auch zweite Lösung funktioniert nicht, wenn ManyToOne Lazy ist (Daten sind in diesem Fall Nullen) – user1321466

+0

Nein, nein, tu das nicht. Durch das Ändern einer verwalteten Entität werden die Änderungen automatisch in der Datenbank übernommen. Sie möchten wirklich nicht alle Städte des Landes usw. entfernen. Und selbst wenn die Entität nicht verwaltet wird, zeigt dies einfach ein Designproblem in Ihrer App. Was Sie zu JSON serialisieren, ist kein Land mit seinen Städten. Es ist das Ergebnis einer Abfrage, die eine Teilansicht von Ländern, Städten usw. enthält. Erstellen Sie einfach eine geeignete Klasse, die die Daten enthält, die Sie wirklich serialisieren möchten und die von Ihrer REST-Ressource zurückgegeben werden. –

+0

Danke, ich denke nach ausgewählten Entitäten werden nicht verwaltet - deshalb bekomme ich kein Update in DB. Aber ich verstehe, was du sagst. So ist es Ihrer Meinung nach falsch, Land mit einer einzelnen Stadt zurückzugeben, die einen einzelnen Angestellten enthält. usw. ... – user1321466

2

Wenn alle Beziehungen bidirektional sind, würde ich vorschlagen, mit Car anzufangen und dann die Hierarchie abzurufen.

select c from Car car 
    inner join fetch car.emp emp 
    inner join fetch emp.city city 
    inner join fetch city.country country 
where car.id = ? 

Denken Sie daran, dass fetch in all die Verbindungen hinzuzufügen, dass Sie verpasst haben.

+0

Vielen Dank. aber ich habe auch emp.setCars (Collections.sigltonlist (Auto)) city.setEmps (Collections.singletonList (emp)) country.setCiyes (Collections.singletonList (Stadt)) dann nur zurückkehren Kreis Objekt zu tun von Spring Controller Sonst während json serialization alle faulen Sammlungen mit Millionen von Daten bevölkert – user1321466

Verwandte Themen