2009-11-03 9 views
25

Sagen wir, ich habe eine Tabelle mit 200 Spalten und die meisten von ihnen werden nie benutzt.2 JPA Entities in der gleichen Tabelle

Ich map SmallEntity zu den 10 Spalten, die oft verwendet werden. Ich verwende es in den Assoziationen mit anderen Entitäten. Es lädt schnell, verbraucht wenig Speicher und macht mich glücklich.

Aber manchmal muss ich die 200 Spalten anzeigen. Ich möchte die BigEntity-Klasse auf den 200 Spalten zuordnen. Es ist an keine andere Entität gebunden, es hat keine Assoziation.

Frage: Haben Sie irgendwelche Erfahrung dabei? Sind Ihnen Probleme bekannt, die Hibernate haben könnte, wie zum Beispiel im First-Level-Cache, in der Dreck-Prüfung und im Entity-Lebenszyklus?

+1

Gute Frage. Die Migration in den neuen Rahmen kann ein weiterer Grund für diese Frage sein. Z.B. Es kann ein Altsystem und ein neues System geben, und beide sollten gegen dieselbe Datenbank arbeiten. – TomR

Antwort

17

Der einfachste Weg, dies zu tun ist, Eigenschaften abzubilden Sie oft als lazy nicht verwenden:

<property name="extendedProperty" lazy="true" /> 

... or using Annotations ... 

@Basic(fetch = FetchType.LAZY) 
String getExtendedProperty() { ... } 

Hibernate würden zunächst solche Eigenschaften nicht geladen werden; Stattdessen werden sie bei Bedarf geladen (beim ersten Zugriff). Sie können Hibernate erzwingen, alle Eigenschaften mithilfe der fetch all properties-Klausel in Ihrer HQL-Abfrage zu laden.

Ein anderes mögliches Szenario besteht darin, zwei vollständig separate Entitäten in derselben Tabelle abzubilden, aber einen von ihnen zu erstellen immutable. Denken Sie daran, dass sie als verschiedene Entitäten von Hibernate behandelt werden, mit ersten/zweiten Ebene Cache für beide vollständig getrennt (weshalb Unveränderlichkeit ist wichtig).

Sie NICHT der Lage sein, diese Funktionalität über Vererbung Mapping zu erreichen, weil Hibernate immer eine tatsächliche konkrete Entitätstyp zurückgibt. Werfen Sie einen Blick auf meine Antwort auf Hibernate Inheritance Strategy Frage für eine detaillierte Erklärung.

+0

Vielen Dank für diese großartige Antwort! –

+0

Es scheint, dass faules Holen von Eigenschaften Bytecode-Instrumentierung erfordert. Ist das bei Projekten so üblich? Dies ist aus Hibernate Annotations guide: Um Lazy Holen der Eigenschaft Ebene zu ermöglichen, müssen Ihre Klassen instrumentiert werden: Bytecode wird zum ursprünglichen hinzugefügt, um diese Funktion zu aktivieren, finden Sie in der Hibernate-Referenz-Dokumentation. Wenn Ihre Klassen nicht instrumentiert sind, wird das Lazy Load der Eigenschaftsebene ignoriert.

+0

Ja, Bytecode-Instrumentierung ist für faule Eigenschaften erforderlich, aber während des Builds einfach hinzuzufügen (http://docs.jboss.org/hibernate/stable/core/reference/en/html/performance.html#performance-fetching-lazyproperties). Es ist nicht sehr häufig (in meiner Erfahrung), weil der Anwendungsfall für faule Eigenschaften (im Gegensatz zu faulen Assoziationen) nicht so häufig ist, aber es ist auch nicht sehr selten. Es wurde sicherlich schon früher gemacht und ist produktionsfertig, wenn es Ihr Anliegen ist. – ChssPly76

Verwandte Themen