Hibernate I18n
Typisierte Entity-Felder mit fester Sprache und relationalen Übersetzungen.
Die Idee
Hibernate I18n speichert übersetzte Inhalte in eigenen Zeilen, während Entity-Felder ihre gewöhnlichen Typen behalten. Die Runtime 1.0.0 legt eine Inhaltssprache pro Session fest und unterstützt übersetzte Abfragen, Fallback und einen typisierten Editorzugriff für Hibernate 7.4.10.Final und PostgreSQL.
Was es kann.
Gewöhnliche Entity-Felder
String-Felder oder konvertierte Werte mit @Translation markieren; das Runtime-Mapping speichert ihre Werte pro Sprache.
Sprachgebundene Abfragen
Übersetzte Werte mit fester Session-Sprache und Fallback pro Feld laden, filtern, sortieren und paginieren.
Übersetzungseditor
Exakte inaktive Sprachen über einen typisierten Zugriff lesen und schreiben, mit Tenant-Isolation und optimistischen Zeilenversionen.
Installation
libraryDependencies += "com.anjunar" % "hibernate-i18n" % "1.0.0"
Paket: com.anjunar:hibernate-i18n
Direkt loslegen.
hibernate-i18n 1.0.0 aus Maven Central einbinden, mit HibernateI18n.registryBuilder() starten, eine @Localized-Entity mappen und vor der ersten sprachgebundenen Session die Brücke für jedes @Translation-Feld installieren. Der Leitfaden erklärt Schema-Start und Editorzugriff.
Typisierte Felder, übersetzte Zeilen
Die Entity behält einen String-Titel. Die Runtime mappt seine Werte auf sprachabhängige Zeilen statt auf eine Titelspalte der Haupttabelle.
import com.anjunar.hibernatei18n.annotation.{Localized, Translation} import jakarta.persistence.{Entity, Id, Table} import java.util.UUID import scala.compiletime.uninitialized (name = "page") (defaultLocale = "en", fallbackLocale = "en") class Page: var id: UUID = uninitialized var title: String = uninitialized
Ein Editor für eine exakte Sprache
Nach dem Runtime-Bootstrap die Titelbrücke einmal installieren. Englisch über den Editorzugriff bearbeiten, während die verwaltete Entity ihren deutschen Session-Wert behält.
import com.anjunar.hibernatei18n.runtime.{TranslationField, HibernateI18n} val titleField = TranslationField.string[Page]("title", _.title) val translations = HibernateI18n.install( factory, classOf[Page], _.id, Seq(titleField)) val session = HibernateI18n.openSession(factory, "de") try val tx = session.beginTransaction() try val page = session.find(classOf[Page], pageId) val english = translations.get(session, page, titleField, "en") translations.set(session, page, titleField, "en", "Hello") tx.commit() catch case error: Throwable => if tx.isActive then tx.rollback() throw error finally session.close()
Bewusst gestaltet.
Eine Session besitzt genau eine Inhaltssprache. Entity-Felder suchen pro Feld nach exakter Sprache, Sprachkürzel, konfiguriertem Fallback und Standardsprache; der Editor liest exakte Überschreibungen. Die Runtime lehnt detached merge, replicate und Query-Caching ab. Ihre Bootstrap-Prüfung schützt vor unvollständigen lokalisierten Mappings.