Ich habe Probleme mit JPA. Ich wäre wirklich dankbar, wenn jemand eine Lösung anbieten könnte. Mit JPA (ich benutze MySQL DB), lassen Sie uns sagen, ich habe eine Klasse wie folgt zugeordnet:
%Vor% Beim Zuordnen zur Tabelle sehe ich, dass String in Mysql mit varchar(255)
verknüpft ist. Nehmen wir jedoch an, wenn ich einen Mitarbeiter habe, dessen Name mehr als 255 Zeichen enthält, wird ein Fehler beim Abschneiden der Daten angezeigt.
Ich weiß, dass wir dies lösen könnten, indem wir der Spalte Mitarbeiter das Attribut "length" hinzufügen:
%Vor%Ist das der einzig mögliche Weg? Ich dachte, wenn wir nur in Java auf String abbilden würden, würde die Datenbank die Länge dynamisch zuweisen.
Beim Zuordnen zur Tabelle sehe ich, dass String in Mysql
mit varchar (255) gemappt ist
Dies liegt daran, dass die Standardlänge von VARCHAR
Spalten in DDL-Anweisungen von den meisten JPA-Providern (einschließlich Hibernate und EclipseLink) 255 ist. Die Angabe des length
-Attributs für die @Column
-Anmerkung hilft dabei, den Wert zu überschreiben Der neue Wert wird vom Schema-Generator des JPA-Anbieters übernommen.
Ich dachte, wenn wir nur in Java auf String abbilden würden, würde die Datenbank die Länge dynamisch zuweisen.
Dies ist eine falsche Annahme. Der JPA-Anbieter erstellt Tabellen nur einmal und ändert die Länge der zugrunde liegenden Tabelle während der Lebensdauer der Anwendung nicht dynamisch, und nur dann, wenn Sie den Anbieter so konfigurieren, dass die Tabellendefinitionen überhaupt erst erstellt / aktualisiert werden. Darüber hinaus ist die Standardzuordnung von String
der SQL VARCHAR
-Typ.
Sie haben anscheinend den JPA-Provider so konfiguriert, dass er Tabellen während der Initialisierung nach Bedarf erstellt (nachdem er sie möglicherweise gelöscht hat). Wenn Sie Hibernate verwenden, verwenden Sie die in hibernate.hbm2ddl.auto
angegebene Eigenschaft persistence.xml
mit dem Wert update
, create
oder create-drop
. Mit EclipseLink würden Sie die Eigenschaft eclipselink.ddl-generation
mit einem Wert von create-tables
oder drop-and-create-tables
angeben.
Beide oben genannten Eigenschaften werden nicht für die Verwendung in einer Produktionsumgebung empfohlen . Der ideale Ansatz besteht darin, DDL-Skripts zum Erstellen der Tabellen zu verwenden. Da Sie VARCHAR
verwenden, sollten Sie eine geeignete Länge in der Spaltendefinition angeben, um die maximale Länge der Benutzereingabe zu berücksichtigen . Da Sie VARCHAR
über CHAR
verwenden, stellt das Datenbankmodul außerdem sicher, dass der zugewiesene Speicherplatz von der Größe der gespeicherten Datensätze abhängt.
Wenn Sie für das standardmäßige VARCHAR
-Mapping keine Zeichenfolge benötigen und stattdessen eine andere gültige Zuordnung verwenden, müssen Sie das columnDefinition
-Attribut der @Column
-Anmerkung verwenden. Eine Beispielverwendung für das Mapping von Calendar
auf den TIMESTAMPTZ
SQL-Datentyp wird im JPA WikiBook gezeigt; Sie müssen dies an Ihre Bedürfnisse anpassen.
varchar-Spalten unterstützen Längen dynamischer Größe (kein Padding wie bei char), aber Sie müssen die maximale Spaltengröße angeben, wenn Sie neben 255 etwas anderes wollen. Verschiedene dbs haben unterschiedliche Grenzen für char und varchar (8k oder 65k ist üblich) .
Wenn Sie diesen Grenzwert überschreiten möchten, müssen Sie der Zeichenfolge eine @Lob-Annotation hinzufügen, damit sie einem CLOB-Spaltentyp zugeordnet wird (vorausgesetzt, Sie lassen JPA Tabellen generieren). CLOB / BLOB-Spalten können viel größer sein als varchar (genaue Grenzen hängen wiederum von Ihrer DB ab). LOBs haben jedoch Einschränkungen, z. B. keine Primärschlüssel zu sein oder in WHERE-Klauseln verwendet zu werden.