2016-06-07 12 views
1

Problembeschreibung:Nested @OneToOne -> @OneToMany nicht @OneToMany Kind Objekt bevöl

Ich habe drei @entities der folgenden Beziehung: Customer -> @OneToOne -> Reservierung -> @OneToMany -> Produktbestellung

Wenn ich den Controller aufrufen, um CustomerOrder direkt abzurufen, wird CustomerOrder und das Child-Objekt Reservation abgerufen. Die List<ProductOrder> bleibt leer.

Wenn ich den Controller anrufen, um die Reservierung direkt zu holen, dann ist die List<ProductOrder> unter Reservierung vollständig ausgefüllt.

Wenn ich das SQL ausspreche, das Hibernate generiert, um List<ProductOrder> abzurufen, zieht dieses SQL tatsächlich die entsprechende ProductOrder-Liste aber Spring füllt die Liste nicht.

Details:

Ich habe drei Klassen (Getter und Setter für Kürze halber weggelassen):

Customer:

@Entity 
public class CustomerOrder { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@OneToOne(fetch = FetchType.EAGER) 
@JoinColumn(
     name="id",referencedColumnName="customerOrderId",insertable=false, updatable=false) 
private Reservation reservation; 

} 

Reservation

@Entity 
public class Reservation { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

//Tie a reservation back to a customer order 
private Long customerOrderId; 

@OneToMany 
@JoinColumn(name = "reservationId", 
    referencedColumnName="id", insertable=false, updatable=false) 
private List<ProductOrder> productOrderList = new ArrayList<ProductOrder>(); 

}

Produkt Bestellen:

@Entity 
public class ProductOrder { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private long id; 

private Long customerOrderId; 

private Long reservationId; 

} 

Ich habe auch zwei Endpunkte. direkt eine, die eine Reservierung holen kann, oder eine, die eine Reservierung über einen Customer holen kann:

@RequestMapping(value = "/customer-order/{id}", method = RequestMethod.GET) 
public @ResponseBody CustomerOrder findOne(@PathVariable(value="id") Long id) {  

    return CustomerOrder customerOrder = customerOrderRepository.findOne(id); 

} 

@RequestMapping(value = "/reservation/{id}", method = RequestMethod.GET) 
public @ResponseBody Reservation findOne(@PathVariable(value="id") Long id) {  

    return reservationService.findOne(id); 

} 

I 1.3.5.RELEASE Version feder Boot mit MySQL 5.6.23

Antwort

1

Ich benutze herausgefunden, was vor sich geht.

Zunächst hatte ich Reservierung eine @ OneToMany Beziehung mit CustomerOrder haben. Dies bedeutete, dass mein Mapping so benutzten soll:

@OneToMany 
@JoinColumn(
     name="customerOrderId",referencedColumnName="id",insertable=false, updatable=false) 
private List<Reservation> reservation; 

ich dann meinen Code geändert, um ein @OneToOne-Mapping zu verwenden. Als ich das tat, blätterte ich meine Join-Spalte so um: @JoinColumn(name="id",referencedColumnName="customerOrderId",insertable=false, updatable=false)

Diese Aktion ist falsch. Als ich ein Reservierungsobjekt über das CustomerOrder-Objekt über ein Mapping abrufen konnte, erhielt es aufgrund einer falschen @JoinColumn-Zuordnung das falsche Reservierungsobjekt.

Die korrekte Lösung besteht darin, meine CustomerOrder @entity zu ändern, um eine ID zu haben, die Reservation referenziert.

Meine Customer Klasse sieht nun wie folgt aus:

private Long reservationId; 

@OneToOne 
@JoinColumn(
     name="reservationId",referencedColumnName="id",insertable=false, updatable=false) 
private Reservation reservation; 

Woops.