Ich schreibe eine Anwendung, in der alle String-Eigenschaften lokalisiert werden müssen, d. h. sie müssen für jedes verfügbare Gebietsschema einen anderen Wert speichern. Eine schnelle Lösung wäre, eine Map zu verwenden, die einfach in Hibernate gemappt werden kann, aber auf dem Java-Programmierer nicht gut ist:
%Vor%Ich habe daher ein LocalString-Objekt implementiert, das verschiedene Zeichenfolgen für verschiedene Gebietsschemata enthalten kann:
%Vor%Das Domänenobjekt wird
%Vor%Wie ordne ich diese Objekte am besten mit Hibernate-Annotationen ab?
Ich denke, die beste Zuordnung würde mit LocalString als Komponente erfolgen:
%Vor%...
%Vor%Alles ist soweit in Ordnung: Die ant-Aufgabe hbm2ddl erstellt zwei Tabellen, eine "Products" -Tabelle und eine "Products_localStrings" -Tabelle, die Schlüssel- und Wertspalten enthält. Alles bricht, wenn ich den Getter für die zweite Eigenschaft hinzufüge:
%Vor%Die zweite Eigenschaft wird nicht im Schema angezeigt. Ich habe versucht, mit dem Tag @AttributesOverride unterschiedliche Namen für die beiden Spalten zu definieren, aber das generierte Schema ist nicht korrekt:
%Vor%Im generierten Schema ist die Schlüsselspalte verschwunden und der Primärschlüssel verwendet "Beschreibung", was nicht korrekt ist:
%Vor%Irgendeine Möglichkeit, das zu beheben?
Wäre ich besser ohne eingebettete Komponenten und benutze LocalString als Entity?
Irgendwelche alternativen Designs?
Danke.
BEARBEITEN
Ich habe versucht mit einem XML-Mapping und ich schaffte es, ein korrektes Schema zu bekommen, aber Einsätze scheitern mit einer primären Schlüsselverletzung, weil Hibernate zwei Einfügungen statt nur einem erzeugt
%Vor%Das Schema ist
%Vor%Protokoll:
%Vor%Wie kann ich Hibernate sagen, dass es nur eine einzelne Einfügung wie die folgende erzeugt?
%Vor%EDIT am 2011.Apr.05
Ich habe die Map-Lösung eine Weile (mit @ElementCollection versehen) verwendet, bis ich auf zwei Probleme gestoßen bin:
Ich weiß, dass es viele Problemumgehungen gibt, wie die Verwendung von HQL anstelle von Kriterien und die Definition einer eigenen FieldBridge zur Pflege der Map in Lucene, aber ich mag keine Workarounds: Sie funktionieren, bis das nächste Problem auftritt. Also folge ich jetzt diesem Ansatz:
Ich definiere eine Klasse "LocalString", die Gebietsschema und Wert enthält (das Gebietsschema ist eigentlich der ISO3-Code):
%Vor%Dann definiere ich für jede Eigenschaft, die ich lokalisieren möchte, eine Unterklasse von LocalString, die leer ist:
%Vor%Jetzt kann ich es in meinem Produkt-Objekt verwenden:
%Vor%Bei diesem Ansatz muss ich eine leere Klasse für jede Eigenschaft schreiben, die ich lokalisieren muss, um eine eindeutige Tabelle für diese Eigenschaft zu erstellen. Der Vorteil ist, dass ich Kriterien und Suche ohne Einschränkungen verwenden kann.
Ihre XML-Zuordnung funktioniert nicht, da Sie Werttypen in derselben Tabelle zugeordnet haben. Wenn Sie element oder composite-element verwenden, werden die Daten als Werttypen behandelt und gehören zu der Klasse, in der sie enthalten sind. Sie benötigt eine eigene Tabelle. Die ID ist nur innerhalb der Sammlung eindeutig.
Ordnen Sie es entweder als Komponente zu:
%Vor%Oder als unabhängige Einheit:
%Vor%Im zweiten Fall ist LocalString eine Entität. Es benötigt eine ID und eine eigene Mapping-Definition.
Tags und Links hibernate localization internationalization schema hibernate-mapping