2015-01-23 11 views
7

Ich weiß, es gibt viele dieser Fragen hier auf SO und auch im Netz, aber alle Antworten schlagen vor, columnDefinition zu verwenden, die datenbankspezifisch und daher nicht für mich anwendbar ist, weil das System I ' Ich arbeite an Bedürfnissen, um auf verschiedenen Datenbanken zu laufen.Standard Spaltenwert mit Anmerkungen in Hibernate

Ich habe diese hibernate issue gefunden, wo jemand diese Funktion für Anmerkungen angefordert hat. Das Problem wurde geschlossen und besagt, dass another issue diese Funktionalität abdecken wird. Das zweite Problem offenbar hinzugefügt Annotation @Generated und auch einige andere, aber ich konnte keine Dokumentation finden, wie Sie den Standardspaltenwert mit diesen neuen Anmerkungen definieren.

Also meine Frage ist: Weiß jemand wie kann ich einen Standardspaltenwert mit Anmerkungen definieren (und NICHT columnDefinition verwenden)?

Bearbeiten: zur weiteren Klärung meines Problems: Wenn ich eine neue nicht Null Spalte hinzufügen, brauche ich Hibernate, um das vorhandene Schema zu aktualisieren (fügen Sie die neue Spalte in die entsprechende Tabelle). Da die Spalte jedoch nicht null ist, kann die Datenbank die Spalte nicht erstellen, ohne den Standardwert anzugeben (wenn bereits einige Zeilen in der Tabelle vorhanden sind). Also muss ich Hibernate anweisen, die folgende DDL-Anweisung zu geben: ALTER TABLE my_table ADD COLUMN new_column VARCHAR(3) DEFAULT 'def', aber es muss unabhängig von der verwendeten Datenbank sein.

Antwort

12

Ich glaube nicht, dass Sie irgendwelche Dokumentation benötigen, die Java-Dokumente sind selbsterklärend. Wenn ich Sie richtig verstehe, müssen Sie einen Standardwert für ein Feld festlegen. Wenn ja, sehen Sie sich das folgende Code-Snippet an.

@Entity 
@Table(name = "my_entity") 
public class SomeEntity extends BaseEntity { 

public static final class MyValueGenerator implements 
     ValueGenerator<String> { 
    @Override 
    public String generateValue(Session session, Object owner) { 
     return "This is my default name"; 
    } 
} 

@Basic 
@Column(name = "name", insertable = true, updatable = true, nullable = false, length = 255) 
// This will add a DDL default 
@ColumnDefault("'This is my default name'") 
// This will add a runtime default. 
@GeneratorType(type = MyValueGenerator.class) 
private String name; 

// getters and setters 

} 
+0

Danke, aber das scheint nur Werte für eingefügte Entitäten zu generieren. Das ist nicht was ich brauche. Ich muss den Standardspaltenwert definieren, wenn die Spalte durch die DDL-Aussage hinzugefügt wird (ich redigierte meine Frage, um es klarer zu machen). – Jardo

+0

@Jardo Haben Sie die Annotation "@ColumnDefault" versucht? Ich werde den Code aktualisieren, um die Änderung widerzuspiegeln. – Babl

+1

@Bbl Das ist genau das, was ich brauchte, danke. Ich habe nur eine Bemerkung: Hibernate setzt den Wert aus der Annotation direkt in die DDL-Anweisung. Wenn Sie also eine Zeichenkette einfügen möchten, müssen Sie sie mit zusätzlichen Anführungszeichen versehen, sonst erhalten Sie einen SQL-Fehler. Wie dieser @ColumnDefault ("Dies ist mein Standardname"). Wenn Sie Ihre Antwort bearbeiten, um dies zu reflektieren, wird es perfekt sein :) – Jardo

3

Folgendes funktioniert für mich.

@ColumnDefault (" '0.0'")

@Column (name = "avgRating")

privaten Schwimmer avgRating;

Verwandte Themen