Hibernate, welche Benennungsstrategie standardmäßig ist

8

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:

  1. DefaultNamingStrategy
  2. EJB3NamingStrategy
  3. 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?

    
weaselflink 08.08.2013, 10:59
quelle

1 Antwort

3

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:

%Vor%

Öffnen Sie den Dump in visualvm und führen Sie die OQL-Abfrage aus:

%Vor%

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:

%Vor%

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:

%Vor%

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!

    
gavenkoa 25.12.2015 15:32
quelle

Tags und Links