2016-05-13 5 views
0

Lassen Sie uns sagen, ich habe die folgende Methode in einer Spring MVC @Controller holen:Hibernate lazy-Ladeverhalten bei Sammlungen von Spring MVC @Controller

@RequestMapping(value = "/list") 
public ModelAndView renderView(@PathVariable("id") int id, @ModelAttribute("someForm") SomeForm someForm) { 

    SomeEntity someEntity = someEntityService.findById(id); 
    someForm.setEntity(someEntity); 
    someForm.setLstFromEntity(
      new ArrayList<SomeSubEntity>(someEntity.getSomeSubEntities()) 
      ); 

    return new ModelAndView("someView", "someForm", someForm); 
} 

someEntityService ist eine @Transactional@Service und die Sammlung Ich holen es ist faul -geladen, so dass es sinnvoll ist, zu denken, dass das Holen fehlschlagen würde, weil keine Sitzung aktiv ist (ich bin mir nicht sicher, ob das wahr ist). Das Abrufen funktioniert jedoch perfekt.

Allerdings habe ich eine andere Methode als @RequestMapping(value = "/save") annotiert, die einen Speichervorgang ausführt und renderView() aufruft, um die Ansicht an den Client zurückzugeben. In diesem Fall gibt someEntity.findById(id) die Entität zurück, ohne jedoch Select auf die Datenbank zu setzen. Alle Felder sind ausgefüllt, aber die Auflistung (PersistentBag) ist leer, daher ist die Entität unvollständig.

Mehr Fragen:

  • Ist die Sitzung wirklich geschlossen?
  • Woher kommt diese someEntity im zweiten Fall?
  • Warum wird die Sammlung leer zurückgegeben?

Antwort

0

Ok, ich denke, dass der Grund für diese Frage unbeantwortet ist, ist der Mangel an Informationen. Wenn ich eine neue Instanz von SomeSubEntity speichere, verwende ich zwei IDs, um zwei Relationen zu definieren, die es mit anderen Entitäten des Modells hat.

new SomeSubEntity(foo1Id, foo2Id); 

Und der Konstruktor von SomeSubEntity tut so etwas wie:

public SomeSubEntity(Integer idFoo1, Integer idFoo2) { 
    this.setFoo1(new Foo1(idFoo1)); 
    this.setFoo2(new Foo2(idFoo2)); 
} 

Der Konstruktor von Foo1/Foo2 die IDs Sätze angegeben und nichts anderes.

foo1Id und foo2Id Spiel zwei IDs von zwei Einheiten von Foo1 und Foo2 beharrte bereits in der Datenbank und im Zusammenhang mit SomeSubEntity über Fremdschlüssel (und Zuordnungen Hibernate), so dass die Transaktion abgeschlossen ist erfolgreich.

Es scheint jedoch, dass die Entitäten von Foo1 und Foo2, die in der Sitzung verbleiben, die gleichen sind, die erstellt wurden (nur IDs, keine Aktualisierung von der Datenbank). Wenn ich eine Eigenschaft von ihnen abrufe, werden Standardklassenwerte zurückgegeben anstelle des realen Wertes aus der Datenbank.

Ich löste es verwalteten Einheiten aus dem DB anstelle einen neuen mit einer passenden ID schaffen:

public SomeSubEntity(Foo1 foo1, Foo2 foo2) { 
    this.setFoo1(foo1); 
    this.setFoo2(foo2); 
} 

new SomeSubEntity(
    foo1DAO.findById(idFoo1), 
    foo2DAO.findById(idFoo2) 
); 

Der Nachteil ist, dass Abfragen sind (natürlich) auf die Datenbank ausgelöst.

Verwandte Themen