2 Stimmen

Überprüfe, ob ein Hibernate PersistentBag geladen ist?

Ich habe eine Klasse, die eine Sammlung automatisch abruft, aber auf träge Weise, da sie nicht immer benötigt wird. Ich habe eine Methode, die auf dieser Sammlung beruht, aber ich möchte nicht, dass das träge Laden ausgelöst wird, wenn es noch nicht stattgefunden hat. Gibt es einen Weg zu erkennen, ob ein PersistentBag nicht geladen wurde, ohne diese Ladung auszulösen?

Beispielklasse:

class MyClass {
  private List toybox;

  @OneToMany (fetch = FetchType.LAZY, mappedBy = "toyBox")
  public List getToybox () {
    return toybox;
  }

  public void setToybox (List toybox) {
    this.toybox = toybox;
  }

  @Transient
  public List toyNames() {
    if (hasNotAlreadyLoaded(this.toybox) {
      return null; // Kann derzeit nicht ausgeführt werden; Daten nicht verfügbar
    }
    return parseToybox(this.toybox);
  }
}

Also, die Frage ist, was soll boolean hasNotAlreadyLoaded(PersistantBag bag) tun, um zu überprüfen, ob die Sammlung geladen wurde? Das Überprüfen der .size() habe ich versucht, aber das löst das Laden aus...

2voto

André Punkte 2164

Wenn Sie Zugriff auf die Hibernate-API (nicht reines JPA) haben, können Sie die Methode Hibernate.isInitialized(java.lang.Object) verwenden.

Aus dem Javadoc geht hervor, dass es zurückgibt

true, wenn das Argument bereits initialisiert ist oder kein Proxy oder keine Sammlung ist

1voto

Andy Dufresne Punkte 5710

Wenn Sie JPA2 verwenden, können Sie dies wie folgt mithilfe von PersistenceUnitUtil tun

PersistenceUnitUtil unitUtil = em.getEntityManagerFactory().getPersistenceUnitUtil();

Assert.assertTrue(unitUtil.isLoaded(myclassInstance));

Assert.assertFalse(unitUtil.isLoaded(myclassInstance, "toyBox"));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X