2009-05-22 4 views
2

Wie meine vorherigen Posts bestätigen können, rüste ich die in-memory, netzwerkgespeicherte Leistung zu einem Szenario auf, das einst vollständig im Winterschlaf war. Dabei treffe ich Probleme, bei denen ich mit Proxy-Objekten arbeite und mich wieder an Sessions anschmiegen muss, aber dabei möchte ich auch die Transactabilität beibehalten. Was sind die besten Methoden, um komplexe Logik aus dem Hibernate-Layer zu entfernen? Ich bin gerade jetzt "voll" in den Winterschlaf gekommen, also ist das eine ziemlich hasserfüllte Erfahrung.Was ist der beste Weg, um Daten aus dem Hibernate-Layer in eine andere Ebene zu ziehen?

Kann jemand, der mit dieser Art von Datenbewegung gearbeitet hat, ausarbeiten, wie Sie das Transaktionsproblem überwunden haben, sich mit proxied Gegenständen usw. befassen? Ich suche gerade nach allgemeinen Ressourcen im Augenblick, da ich kämpfe, um zu schwimmen.

Danke.

Antwort

2

Sie müssen sich auf 2 Dinge entscheiden:

  • Ihre Session-Management-Strategie
  • Ihre zugehörigen Abrufstrategie

Es ist gut post von Ga vin King, erklärt einige der Optionen für den Umgang mit Sitzungen (der Beitrag ist über die Leistung, ist aber auch allgemein anwendbar).

Zum Abrufen ist eine Sache zu berücksichtigen, die Anzahl der von Ihrer Hibernate-Schicht zur Verfügung gestellten Primitiven zu erhöhen. Z.B. Stellen Sie sich vor, Sie hätten eine Entität Foo, die eine 1-N-Beziehung zu Bar hat und in einigen Fällen benötigen Sie nur die Foo-Objekte, in anderen benötigen Sie sowohl die Foos- als auch die Child-Bar-Objekte. Sie könnten diese als separate Aufrufe der Hibernate-Schicht darstellen.

class HibernateLayer { 
    public List<Foo> findFoo(String someCriteria) { 
     Query q = new Query("from Foo f where f.someCriteria = :1"); 
     //... 
    } 

    public List<Foo> findFooWithBars(String someCriteria) { 
     Query q = new Query("from Foo f left join fetch Bar b where f.someCriteria = :1"); 
     //... 
    } 

Dies hat zwei Vorteile, 1 Sie werden nicht mit faul geladenen Proxy-Objekte behandeln, werden Sie alle haben die Daten, die Sie brauchen, und es wird eine bessere Leistung als die generierte SQL, um die Situation besser geeignet sein wird, . Es hat jedoch den Nachteil, dass Sie vor dem Aufruf der Hibernate-Schicht wissen müssen, ob Sie die tiefere Datenebene benötigen. Um sicherzustellen, dass Ihre Daten konsistent bleiben (der Hauptzweck der Transaktionen), stellen Sie sicher, dass Sie mindestens optimistic locking verwenden.