Bei der Suche nach einer benutzerdefinierten Benennungsstrategie (nur für Tabellennamen) bin ich auf eine Inkonsistenz gestoßen, die ich nicht lösen kann. (Ich benutze Hibernate-Core 3.6.6.Final auf JBoss 6.1.0.Final mit PostgreSQL 9.1.9)
Es scheint drei eingebaute Implementierungen für NamingStrategy
zu geben:
DefaultNamingStrategy
EJB3NamingStrategy
ImprovedNamingStrategy
Der Standardwert scheint auf EJB3NamingStrategy
in org.hibernate.cfg.Configuration
gesetzt zu sein.
Die Tabellennamen scheinen jedoch nach einer Strategie festgelegt zu sein, die keiner der oben genannten entspricht.
Beispiel:
Klassenname: package.ClassName
Resultierender Tabellenname: classname
Die Strategien 1 und 2 rufen einfach StringHelper.unqualify( className )
auf, was einfach alle Paketnamen und -punkte entfernt, also sollte das Ergebnis ClassName
sein.
Strategie 3 entfernt alle Paketnamen und -punkte, fügt dann vor jedem Kamelbuchstaben einen Unterstrich ein und konvertiert schließlich in Kleinbuchstaben, was class_name
ergeben sollte.
(Quellcode von Hibernate 4.1.0.Final scheint in diesen Klassen unverändert zu sein.)
Könnte mir jemand helfen, das zu klären?
Sehr einfach! Weil ich keine Zeit damit verbringen möchte, eine Spielzeugumgebung mit hibernate-core 3.6.6.Final
zu erstellen, gebe ich Ihnen Anweisungen, wie Sie überprüfen können, welche Instanz GENAU IN IHRER ARBEITSANWENDUNG verwendet wurde.
Installieren Sie visualvm
auf Ihrem Host. Es ermöglicht, Heap-Dump für lokale Anwendung zu erstellen. So erstellen Sie Heap-Dump auf Server entfernen - auf Server ausführen:
Öffnen Sie den Dump in visualvm
und führen Sie die OQL-Abfrage aus:
Das ist IHRE NAMINGSTRATEGIE . Sie können die Registerkarte "Instance" verwenden, um durch die Referenzhierarchie zu navigieren, um zu erfahren, welche anderen tatsächlichen Typen von hbm
oder jpa
NamingStrategy verwendet werden.
Verschiedene Versionen von Hibernate haben verschiedene deklarierte Felder und Typen. Wenn kein namingStrategyDelegator
-Feld vorhanden ist, versuchen Sie zu instanzen:
Wenn diese Klasse nicht in Ihrer Version von Hibernate enthalten ist, versuchen Sie, die Dokumente und Quellen zu lesen und die entsprechende Klasse zu finden.
Mit Abhängigkeit org.hibernate:hibernate-entitymanager:jar:4.3.11.Final
habe ich:
und es intern verwendet:
%Vor% abhängig von den JPA-Annotationen. In jedem Fall verweisen diese Instanzen auf LegacyNamingStrategyDelegator
(ja, zyklische Referenzen!), Die das Feld namingStrategy
mit der Instanz von org.hibernate.cfg.EJB3NamingStrategy
haben.
Das alles! Ich verbringe 1 Minute damit, in meinem Wepapp die Standardstrategie für die Namensfindung zu finden und 5 Minuten, um diesen Beitrag zu schreiben (
Danke fürs Zuschauen, fröhliches Hacken!