So erhöhen Sie die Länge eines Strings in mysql während der Zuordnung mit JPA

7

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.

    
Ashok 22.09.2011, 04:58
quelle

2 Antworten

14
  

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.

    
Vineet Reynolds 22.09.2011, 06:19
quelle
7

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.

    
Chase 02.08.2012 22:54
quelle

Tags und Links