Trim String-Feld in JPA
Ich habe eine db-Tabelle mit Spalte vom Datentyp char(20). Ich bin mir nicht erlaubt zu ändern, um eine varchar.
Schreibe ich eine JPA-Entität zugeordnet, um diese Tabelle. Ich würde gerne die string-Feld für diese Spalte in meiner entity-Klasse enthält immer den getrimmten Wert, nicht der Wert 20 Zeichen mit Leerzeichen aufgefüllt, die es in der db.
Ich sehe keine einfache Möglichkeit, dies zu tun. (eine Anmerkung würde rock!). Im moment bin ich einfach wieder eine beschnittene Wert von meinem getter(), aber das fühlt sich an wie ein Schlamassel.
Einer google-Suche bietet keine Hilfe. Irgendwelche Ideen?
Kommentare dem Thema
Nur Frage mich, was passieren würde, wenn Sie möchten, verwenden Sie
@ColumnDefinition
und definieren Sie die Spalte als VARCHAR
auch wenn es ein CHAR
. Wahrscheinlich wäre das Ergebnis das gleiche oder ein Fehler. Die annotation @ColumnDefinition ist nur sinnvoll, wenn Sie bei der Generierung des db-Schemas. Wenn Sie nicht Geist mit reinen Hibernate und abweichend von der JPA-standard, den Sie verwenden können, Hibernate @ColumnTransformer vorausgesetzt, Sie haben eine Funktion in der Datenbank zu tun, die Arbeit, die Sie finden können, wie es in der Hibernate-Referenz: docs.jboss.org/hibernate/core/3.6/reference/en-US/html/...
Ich sehe nicht, was ist falsch mit Ihrem original-Lösung. Ihre aktuelle apprpoach richtig ist. Wie Sie sehen können, in den Antworten vorgeschlagen, es wird nicht einfacher als das. Die einzige bessere Lösung ist: ändern Sie das Datenbank-Feld vom Typ VARCHAR, die Sie gesagt, Sie können nicht.
@edalorzo wenn wir reden über ein oder zwei Eigenschaften, Stimme ich zu. Wenn dies ein Muster, das angezeigt wird, die alle über eine große code-Basis, unter Verwendung eines engagierten Hörer ist viel zuverlässiger
@sean patrick floyd ja es wird erscheinen, die alle über eine große Codebasis.
InformationsquelleAutor der Frage jcreenaune | 2011-04-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oder verwenden Sie lifecycle Anmerkungen:
In diesem Fall auf mehrere Entitäten können Sie erstellen Sie eine benutzerdefinierte Beschriftung und schreiben Sie eine dedizierte EntityListener.
Annotation
Zuhörer
Jetzt kommentieren alle relevanten String-Felder mit
@Trim
und den Listener als default entity listener in Ihrem persistence.xml:InformationsquelleAutor der Antwort Sean Patrick Floyd
Die akzeptierten Antworten (mit JPA entity Listener /@Trim Anmerkung), ist gefährlich. Aufruf der setter auf die abgerufene Einheit angezeigt wird, markieren Sie die Entität als schmutzig. Als ich dies versuchte, mich an einem Wurzel-entity-Ebene (mit Spring3 /hibernate), ausgelöst Tonnen überflüssige updates zu verwandten Organisationen, die sonst nicht geändert werden, während der Transaktion. Es war ein echtes Chaos in der Produktion, und tracking es nach unten, um diese als Ursache nahm sich Zeit.
Am Ende entschied ich mich zu gehen mit den einfacheren Ansatz trimmen Sie die einzelnen Felder manuell on-demand (in einer benutzerdefinierten Entität-zu-domain-mapper, oder in der Entität getter) ähnlich wie Edwin ' s Antwort.
InformationsquelleAutor der Antwort patrickd
Welche JPA-provider verwenden Sie?
Wenn Sie mit EclipseLink CHAR-Felder abgeschnitten werden, standardmäßig. Sie können deaktivieren Sie diese über die Sitzung trimStrings Eigenschaft (sicherzustellen, dass Sie nicht gesetzt haben).
InformationsquelleAutor der Antwort James
Ich bin mit dieser Methode, die macht der Trimm-transparent, ohne Einsatz von Annotationen in jeder string-Feld.
In demselben Paket, das Sie haben Ihre session-factory-Klasse (die, die Sie verwenden, um Sitzungen, e.g
org.blablabla.yourpackage.etc.SessionGetter.getSession()
haben, müssen Sie erstellen eine Datei mit dem Namenpackage-info.java
und setzen diesen Inhalt:Dann erstellen Sie die Klasse
StringUserType
im gleichen Paket:Und das ist es, keine Notwendigkeit, erstellen Sie eigene Anmerkungen in deine Bohnen, wird es "magisch" schneiden Sie die Saiten, wenn man die Objekte aus der Datenbank.
InformationsquelleAutor der Antwort Mateus Viccari
Setzen Sie die annotation, die auf die get-Methode verwenden, legen Sie die @Acesss zu AccessType.Eigentum und schneiden Sie den Bereich gibt es mit String.trim () - Methode.
Oder einfach die Trimmung in der get-Methode, und immer auf das Feld über. Es ist nicht viel einfacher als das.
Wenn Sie nicht Geist mit reinen Hibernate und abweichend von der JPA-standard, den Sie verwenden können, Hibernate @ColumnTransformer vorausgesetzt, dass Sie eine Datenbank-Funktion, um die Arbeit der
Können Sie finden, wie es in der Hibernate-Referenz:
http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-column-read-and-write
Ich hoffe, das hilft!
InformationsquelleAutor der Antwort Edwin Dalorzo
Alles, was Sie tun müssen ist, setzen Sie diese auf Ihrem controller, und es funktioniert wie erwartet, brauchen Sie nicht einen listener oder etwas in der
InformationsquelleAutor der Antwort Rudy
Wenn Ihr domain-Vorschrift heißt es, es muss getrimmt Informationen, die Sie benötigen, um die Daten zu speichern im getrimmt Wert. Ich sehe nichts falsch daran.
Wenn Sie ausdrücklich geltend zu machen, die business-Regel, die auf der Datenbank-Ebene, eine option ist, dass Sie die Wahl haben, schreiben Sie einen trigger, die Sie verwenden können, built-in SQL-trim-Methode. Aber es wird sein wie mit einer Rakete zu knacken ein ei.
InformationsquelleAutor der Antwort zawhtut