2016-04-04 18 views
2

Ich habe zwei Entitäten in meinem Projekt mit einer Viele-zu-viele-Beziehung zwischen ihnen. Die Relation wird mit Hilfe einer Helfer-Mapping-Tabelle in Postgres dargestellt, die die relevante ID für jede Entität enthält, ziemlich Standard.Hibernate verursacht Endlosschleife mit @ManyToMany bidirektionalen Beziehung

Nennen wir die Tabelle bucket_object_mapping und es hat zwei Spalten: bucket_id, object_id.

Der Eimer Klasse:

@Entity 
@Table(name = "bucket") 
public class Bucket { 
    // Some fields omitted here 

    @ManyToMany(cascade = {}, fetch = FetchType.LAZY) 
    @JoinTable(
     name = "bucket_object_mapping", 
     joinColumns = @JoinColumn(name = "bucket_id"), 
     inverseJoinColumns = @JoinColumn(name = "object_id") 
    ) 
    private List<Model> models; 
} 

In der Model Klasse I keine Zuordnung zur Bucket Klasse (keine Notwendigkeit dafür)

Wenn ich laufen diese einfache Abfrage:

SELECT bucket FROM Bucket bucket WHERE bucket.customerId=:customerId 

Die Daten werden zunächst gut zurückgegeben, aber dann eine Endlosschleife von Abfragen an die Model Tabelle beginnt zu laufen und ich bin mir nicht sicher warum. Es sieht so aus, als wenn ich die Ergebnisliste über einen SpringMVC-Controller zurückgebe. Ich konvertiere die Bucket zu einem DTO, aber nicht die Model (Es ist nur, dass die Einheit keinen Verweis auf die Bucket, so dass es nicht ein zirkuläres Referenzproblem sein soll).

Controller-Code:

@RequestMapping(value = "", method = RequestMethod.GET) 
@ResponseBody 
public List<BucketDTO> getAllByCustomer(@RequestParam(value = "customerid") final Long customerId) { 
    return bucketService.getAllBucketsForCustomer(customerId); 
} 

Der Code im Dienst:

@Transactional 
public List<BucketDTO> getAllBucketsForCustomer(final Long customerId) { 
    List<Bucket> buckets = bucketDao.getBucketsForCustomer(customerId); 
    List<BucketDTO> result = bucketDtoConverter.toDtoList(buckets); 
    return result 
} 
+0

Können Sie bitte Code für Ihren Controller posten? – LearningPhase

+0

@LearningPhase - hat die Frage bearbeitet. Ich fügte auch die Service-Methode hinzu, die zwischen dem Controller und dem DAO überbrückt. – Avi

+0

Zeigen Sie Model.class. Hast du eine Beziehung zu Bucket.class? – Victor1125

Antwort

4

stellt sich heraus, das Problem in den Model entstanden war. Während Model keinen Verweis auf Bucket hat, hat es einen Verweis auf ein anderes Objekt mit einer @OneToMany Annotation (und das referenzierte Objekt verweist auf Model mit @ManyToOne).

Ich konvertierte alles (Bucket, Model und das dritte Objekt) in DTOs und jetzt funktioniert es. Der Grund dafür ist, weil die Endlosschleife verursacht wurde, als die Jackson-Bibliothek versuchte, das Ergebnis zu serialisieren. Da es eine bidirektionale Referenz vom Model Objekt zu einem anderen Objekt gab, blieb es in einer Endlosschleife stecken, die versuchte, diese zu serialisieren. Durch die Konvertierung in DTO habe ich sichergestellt, dass nur einen Verweis auf das andere Objekt enthält, so dass es das Problem löst.

können Sie den Chat folgen, die auf die Antwort führte here

-1

I thnik sollten Sie Beziehung von Modell löschen (wenn vorhanden) oder mappedBy hinzufügen. Wenn Sie Beziehung haben auf Model.class und kein @MappedBy Sie so erste Platte auf dem Tisch bucket_object_mapping für Bucket und zweite Datensatz erstellen für Model

+0

Ich bin mir nicht sicher, ob ich deine Antwort genau verstehe. Aber ich habe 'Bucket' in' Model' nicht erwähnt. Obwohl die Beziehung bidirektional ist, wird sie nur vom 'Bucket'-Ende benötigt. Also - keine Erwähnung von 'Bucket' in' Model' Entität – Avi

+0

Ich habe gedacht, Sie haben. Ok, tut mir leid. – Victor1125

+0

Kein Problem. Schätze deinen Versuch zu helfen. – Avi

Verwandte Themen