2010-05-20 8 views
47

Was genau macht die Einstellung der Länge einer Spalte in JPA?Was bewirkt das Längenattribut, wenn es in der @Column JPA-Annotation festgelegt ist?

@Column(name = "middle_name", nullable = false, length = 32) 
public String getMiddleName() { 
    return this.middleName; 
} 

Ich verstehe, dass Sie die Anmerkungen verwenden können, das Datenbankschema (DDL), basierend auf den Entitätsobjekten zu erzeugen, aber tut Länge jede Art von Scheck oder Verkürzung, wenn Persistenz geschieht, oder es nur für Schema-Erstellung verwendet ?

Ich weiß auch, dass JPA auf verschiedenen Implementierungen sitzen kann, die Implementierung, die ich in diesem Fall betroffen bin, ist Hibernate.

Antwort

67

Führt die Länge irgendeine Art von Überprüfung oder Kürzung durch, wenn Persistenz auftritt, oder wird sie ausschließlich für die Schemaerstellung verwendet?

length Das Attribut der Column Anmerkung wird verwendet, um anzugeben:

die Spaltenlänge. (Gilt nur, wenn eine stringwertige Spalte verwendet wird.)

Und wird nur in der generierten DDL verwendet. In Ihrem Beispiel würde die resultierende Spalte als VARCHAR(32) generiert werden und der Versuch, eine längere Zeichenfolge einzufügen, würde zu einem SQL-Fehler führen.


Zur Validierung, könnten Sie eine @Size(max=32)constraint vom Bean Validation API (JSR 303) hinzuzufügen. Ich stellte eine Probe mit einem lauffähigen Test zur Verfügung here.

Bereitstellung sowohl Size und length überflüssig erscheinen, aber nach dem Appendix D. der spec Bean Validation, Erzeugen Bean Validation-aware DDL ist nicht zwingend für Persistence Provider. Verwenden Sie daher length für die DDL, @Size für die Validierung.

Falls Sie interessiert sind, fügen Sie einfach eine Bean Validation-Implementierung in den Klassenpfad mit JPA 2.0 ein. Mit JPA 1.0, siehe previous answer.

+2

Danke, ich vermutete so viel. Haben Sie zufällig ein Zitat, dass die Anmerkung nur für die DDL ist? Ich konnte es in der Dokumentation nicht explizit finden. –

+1

Ich habe versucht, sowohl @Size (max = 32) 'und' @Column (length = 128) 'zu verwenden und unglücklicherweise scheint' @ Size' Vorrang zu haben. Vielleicht ist das ein Hibernate Bug. –

+1

Zum Beispiel, wenn ich eine Spalte mit der Länge 1500 erstellen, wird es als "TEXT" in MySql generiert. Wie sieht die Größenbeschränkung in diesem Fall aus? Oder gilt es überhaupt? Vielen Dank. – rpr

3

@column (length = 32) ist nur für DDL-Zwecke und nicht zum Einschränken bedeutet es erlaubt mehr als 32 Zeichen, es sei denn, auf Tabellenebene ist es nicht eingeschränkt. Um die Größe zu beschränken, gehen wir für @size (max = 32)

2

Btw, wenn Sie die Länge nicht gesetzt ist, wird es

2

Hibernate 4.3.11 (und andere Versionen mit MySQL) 255 standardmäßig (getestet werden) sollten ihr Augenmerk auf Validation Annotations bezahlen. - so haben Sie vielleicht

Das sind zitiert aus Hibernate 4.3.11 manual

Chapter 22.Additional modules

Hibernate Core bietet auch die Integration mit einigen externen modules/Projekte zu aktualisieren. Dazu gehört Hibernate Validator die Referenz Implementierung von Bean Validierung (JSR 303) und Hibernate Search.

Chapter 22.1 Bean Validation

... Die Integration von Hibernate und Bean Validation arbeitet auf zwei Ebenen . Erstens ist es in der Lage, In-Memory-Instanzen einer Klasse für Constraint-Verletzungen zu überprüfen. Zweitens kann es die Einschränkungen auf das Hibernate-Metamodell anwenden und sie in das generierte Datenbankschema integrieren. ...

Chapter 22.1.4 Database schema

Hibernate verwenden Einschränkungen Bean Validation ein genaues Datenbankschema zu generieren:

@NotNull leads to a not null column (unless it conflicts with components or table inheritance) 

@Size.max leads to a varchar(max) definition for Strings 

@Min, @Max lead to column checks (like value <= max) 

@Digits leads to the definition of precision and scale (ever wondered which is which? It's easy now with @Digits :)) 

Hinweis: @Lengh funktioniert auch, wie @Size


Wenn Sie Hibernate Validator 5.1 verwenden - dann benötigen Sie auch eine el-Implementierung. Zum Beispiel

<dependency> 
    <groupId>org.glassfish.web</groupId> 
    <artifactId>el-impl</artifactId> 
    <version>2.2</version> 
</dependency> 

Wenn Sie dies nicht, dann Hibernate ORM nicht in der Lage gewesen, Hibernate Validierung zu starten, Anzeige daher wäre es nicht nehmen (alle) JSR-303 zum Beispiel @Length, @Size Konto!

Verwandte Themen