In JPA die Fetch Der Modus wird für jedes Persistenzattribut entweder über eine Annotation oder in einer XML-Zuordnungsdatei angegeben.
Also ein JPA-Anbieter agnostic Weg, um Ihr Ziel zu erreichen ist separate Mapping-Datei für jede DAO-Schicht. Leider erfordert dies eine separate PersistenceUnit für jede Zuordnungsdatei, aber Sie können zumindest die gleichen Entitätsklassen und die gleiche JPQL-Abfrage verwenden.
Code Skelette folgen.
persistence.xml:
<persistence>
<persistence-unit name="dao-eager">
<mapping-file>orm-eager.xml</mapping-file>
</persistence-unit>
<persistence-unit name="dao-lazy">
<mapping-file>orm-lazy.xml</mapping-file>
</persistence-unit>
</persistence>
ORM-eager.xml:
<entity-mappings>
<entity class="ErrorCode">
<attributes>
<basic name="name" fetch="EAGER"/>
</attributes>
</entity>
</entity-mappings>
ORM-lazy.xml:
<entity-mappings>
<entity class="ErrorCode">
<attributes>
<basic name="name" fetch="LAZY"/>
</attributes>
</entity>
</entity-mappings>
Dann ist es nur eine Frage der eine EntityManagerFactory Schaffung für die entsprechende Persistenz-Einheit in Ihren DAO-Layern.
Eigentlich brauchen Sie nicht zwei Mapping-Dateien, Sie könnten entweder LAZY oder EAGER als Annotation in der Entity angeben und dann das Gegenteil in einer XML-Mapping-Datei angeben (Sie wollen aber immer noch zwei Persistenz-Einheiten).
Möglicherweise ein wenig mehr Code als die Hibernate-Lösung oben, aber Ihre Anwendung sollte für andere JPA-Anbieter tragbar sein.
Nebenbei bietet OpenJPA eine ähnliche Funktionalität wie die obige Hibernate-Lösung mit FetchGroups (ein Konzept, das von JDO übernommen wurde).
Ein letzter Vorbehalt, FetchType.LAZY ist ein Hinweis in JPA, der Provider kann die Zeilen bei Bedarf geladen werden.
Aktualisiert pro Anfrage.
eine Einheit wie folgt vor:
@Entity
public class ErrorCode {
// . . .
@OneToMany(fetch=FetchType.EAGER) // default fetch is LAZY for Collections
private Collection myCollection;
// . . .
}
In diesem Fall, dass Sie noch zwei Persistenzeinheiten bräuchten, aber Sie werden nur ORM-lazy.xml benötigen. Ich habe den Feldnamen geändert, um ein realistischeres Szenario darzustellen (nur Sammlungen und Blobs verwenden standardmäßig FetchType.LAZY). So ist die resultierende ORM-lazy.xml könnte wie folgt aussehen:
<entity-mappings>
<entity class="ErrorCode">
<attributes>
<one-to-many name="myCollection" fetch="LAZY"/>
</attributes>
</entity>
</entity-mappings>
Und persistence.xml wird wie folgt aussehen:
<persistence>
<persistence-unit name="dao-eager">
<!--
. . .
-->
</persistence-unit>
<persistence-unit name="dao-lazy">
<!--
. . .
-->
<mapping-file>orm-lazy.xml</mapping-file>
</persistence-unit>
</persistence>
Danke Klaus, offensichtlich Option B ist der Code, abhängig vom Import von Hibernate gehen machen, was ein Nachteil ist, aber ich Ich werde es versuchen. –
Hallo Nemo, kannst du bitte meine Antwort mit dem grünen Häkchen markieren. ;) – H2000
Ich bin immer noch ein 'Sitzung geschlossen' Problem mit Methode b. –