Wie man eine Hibernate-Entität internationalisiert

8

Ich versuche, Java-Entitäten Unterstützung für die Internationalisierung (mehrere Sprachen) hinzuzufügen. Ich bin offen für alle Optionen mit so wenig wie möglich Code, wenn Sie zu jedem neuen Feld eine Übersetzung hinzufügen. Ich bin nicht auf JPA beschränkt, kann Hibernate Annotations auch verwenden. Im schlimmsten Fall wird auch sql passen. Möglicherweise gibt es einige fertige Bibliotheken, die ich nicht gefunden habe. Es sollte nicht notwendig sein, meiner unten beschriebenen Idee zu folgen.

Idealerweise muss die Datenbank so aussehen:

%Vor%

i18n ist eine Tabelle, die nur 3 Spalten enthalten sollte: id , locale und text . Die Tabelle parent hat eine Spalte text (wenn es nur ein einzelnes Feld gibt, das i18n benötigt, ansonsten mehr Spalten), das Werte von i18n.id enthält. Ich habe das folgende Mapping in der Elternklasse versucht:

%Vor%

Es scheint zu funktionieren, wenn die DDL-Generierung deaktiviert ist und ich selbst Tabellen erstelle, aber wenn die DDL-Generierung aktiviert ist, erzeugt es eine unnötige Spalte i18n.parent_id und eine Einschränkung dafür:

%Vor%

Wie kann ich diese zusätzliche Spalte loswerden? Ist es möglich, eine Referenz von i18n table auf parent table zu vermeiden? Diese Verknüpfung erschwert die Wiederverwendung der Tabelle i18n . Ich muss entweder einen Diskriminatorwert in i18n table halten oder GUID in der gesamten Datenbank verwenden, da IDs in verschiedenen Tabellen kollidieren. Die erste Option bedeutet viel Code. Die zweite Option bedeutet viel Arbeit im aktuellen Projekt.

Ich brauche eine wiederverwendbare Möglichkeit, i18n zur Entität hinzuzufügen. Meine Elternklassen werden ungefähr so ​​aussehen. Und es wird mehrere solcher Elternklassen mit verschiedenen Feldern geben , die internationalisiert werden müssen.

%Vor%     
user1603038 26.09.2016, 13:50
quelle

4 Antworten

2
  

Auf der Datenbankebene werden Auflistungsinstanzen durch den Fremdschlüssel der Entität unterschieden, die die Sammlung besitzt. Dieser Fremdschlüssel wird als Sammlungsschlüsselspalte oder -spalten der Sammeltabelle bezeichnet.

Ich nehme an, dass Sie die Generierung des generierten Schlüssels für Ihren Vorschlag deaktivieren möchten, einfach können Sie dies mit diesem

tun %Vor%

Dann, wenn Sie die generierte DDL verifizieren, wird der vergebende Schlüssel nicht auf die I18N-Tabelle angewendet, erhält aber immer noch die Fähigkeit

%Vor%

Info ist ein einfacher Test (Spring Boot 1.4 Release), und die Ausgabe wird in der Konsole angezeigt:

%Vor%

Dies ist die Tabelle in H2 db:

    
Liping Huang 30.09.2016 06:06
quelle
0

Geben Sie nicht einfach% code_% mit

an %Vor%

statt

%Vor%

Ссылка

  

Bei Verwendung in einer CollectionTable-Zuordnung ist die referenzierte Spalte   die Tabelle der Entität, die die Sammlung enthält

Im Wesentlichen definieren Sie also die ID-Spalte im Elternteil (neu) und Hibernate generiert die FK-Spalte in i18n mit der Standardbenennungsstrategie.

Verwenden Sie dies:

%Vor%

erzeugt Folgendes:

%Vor%     
Alan Hay 29.09.2016 18:34
quelle
0

Sieht so aus, als ob Hibernate keine i18n support-Unterstützung bietet. Sie können also auf diese Weise eine benutzerdefinierte Lösung implementieren. Ich kann auch davon ausgehen, dass es Ihr Ziel ist, mit minimalem Aufwand Lokalisierungsunterstützung zu einem bestehenden Projekt hinzuzufügen.

Ich kann Ihnen vorschlagen, ManyToMany relation für Parent und i18n tables zu verwenden.

In diesem Fall sind Sie völlig unabhängig von Parent und i18n tables Struktur, wie Sie wollen, aber es gibt einige Gemeinkosten mit zusätzlichen Join-Tabellen pro "Parent" , die PK-Referenzpaare bilden i18n und "Parent" Tabelle. Auch mit ManyToMany -Ansatzdatensätzen kann das Formular i18n in verschiedenen "Parent" -Tabellen wiederverwendet werden.

So könnte Ihre Tabellenstruktur wie folgt aussehen:

%Vor%

Beispiel für einen Entitätscode:

%Vor%     
Sergey Bespalov 06.10.2016 04:00
quelle
0

Sieht so aus, als ob Sie nach dem zusammengesetzten Primärschlüssel für den Ruhezustand suchen. Sie sollten diesen Trick durchführen:

%Vor%

Leider habe ich keine Idee, wie man es als "locale" Map abbildet, aber denke es mit @ JoinColumn Annotationen möglich, oder versuche, @Alan Hay Post zu folgen.

    
degr 06.10.2016 10:54
quelle