Beachten Sie, dass die Zeichenfolge in columnDefinitiondatenbankabhängig ist. Wenn Sie diese Option auswählen, müssen Sie sie auch verwenden dynamic-insert, sodass beim Einfügen Hibernatekeine Spalten mit nullWerten enthalten sind. Andernfalls ist es irrelevant, über Standard zu sprechen.
Wenn Sie jedoch keinen Standardwert für die Datenbank, sondern nur einen Standardwert in Ihrem Java-Code möchten, initialisieren Sie Ihre Variable einfach so: private Integer myColumn = 100;
Mit Anmerkungen: @ org.hibernate.annotations.Entity (dynamicInsert = true)
Homaxto
9
Derzeit org.hibernate.annotations.Entityist veraltet. @DynamicInsertStattdessen sollte eine Anmerkung verwendet werden.
Jannis
1
Ich würde die Verwendung von columnDefinition für diese Situation nicht empfehlen. Dies ist nicht von einer Datenbank auf eine andere portierbar, und Sie müssen die spezifische SQL-Sprache Ihres Servers kennen.
pdem
@DynamicInsert muss der Datenbank-Pojo-Klasse hinzugefügt werden.
Sie können eine @PrePersistAnotation verwenden und den Standardwert in der Phase vor der Persistenz festlegen.
Sowas in der Art:
//... some codeprivateString myProperty;//... some code@PrePersistpublicvoid prePersist(){if(myProperty ==null)//We set default value in case if the value is not set yet.
myProperty ="Default value";}// property methods@Column(nullable =false)//restricting Null value on database level.publicString getMyProperty(){return myProperty;}publicvoid setMyProperty(String myProperty){this.myProperty= myProperty;}
Diese Methode hängt nicht vom Datenbanktyp / der Datenbankversion unter dem Ruhezustand ab. Der Standardwert wird festgelegt, bevor das Zuordnungsobjekt beibehalten wird.
Vorausgesetzt, setMyPropertydas wird von Ihrem Beispiel nicht verwendet. Warum schließen Sie es ein?
EndermanAPM
Ich gebe nur das Beispiel von Annotationen im Ruhezustand für die Standard-Java-Eigenschaft (private Variable mit öffentlichen get / set-Methoden). Ich habe einen Fehler bemerkt und korrigiert ... Der String-Typ der Set-Methode argumet fehlte.
Dbricman
30
Was ist mit dem Festlegen eines Standardwerts für das Feld?
Danke, es funktioniert. Aber ich musste die Tabelle neu erstellen.
Yamashiro Rion
1
Dies sollte die eigentliche Lösung sein. Die Verwendung von columnDefinition, wie in der aktuellen Antwort vorgeschlagen, ist ein Kinderspiel, und Sie müssen den Typ angeben. Die Annotation @ColumnDefault ist meiner Meinung nach viel einfacher.
Judos
7
Wenn Sie es in der Datenbank tun möchten:
Legen Sie den Standardwert in der Datenbank fest (SQL Server-Beispiel):
ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] DEFAULT (newid()) FOR [COLUMN_NAME]
Es gibt ein Problem für Oracle: Wenn die Eigenschaft nicht null ist, ist ihr Wert NOCH der Standardwert. Nicht der tatsächliche Wert.
Youngzy
5
Eine Lösung besteht darin, Ihren Getter überprüfen zu lassen, ob der Wert, mit dem Sie arbeiten, null ist (oder der nicht initialisierte Status), und wenn er dem entspricht, geben Sie einfach Ihren Standardwert zurück:
Ich verwende einen Mapper, der den Setter für mein Entity-Objekt aufruft. Gibt es einen Nachteil bei der Verwendung Ihres Code-Snippets sowohl für den Getter als auch für den Setter?
Eric Francis
4
Ich habe danach gesucht und viele Antworten auf den Standardwert für die Spalte gefunden. Wenn Sie den in der SQL-Tabelle definierten Standardwert verwenden möchten, verwenden Sie in @Column Annotation "insertable = false" . einsteckbar
Sie können den Java-Klassenkonstruktor verwenden, um die Standardwerte festzulegen. Beispielsweise:
publicclassEntityimplementsSerializable{privateDouble field1
privateInteger field2;private T fieldN;publicEntity(){this.field1=0.0;this.field2=0;...this.fieldN=<your default value>}//Setters and Getters...}
So verwenden Sie den Standardwert aus einer beliebigen Tabellenspalte dann müssen Sie @DynamicInsertals wahr definieren , sonst definieren Sie nur @DynamicInsert. Weil der Ruhezustand standardmäßig als wahr gilt. Betrachten Sie als gegebenes Beispiel:
Wenn Sie einen Standardwert für die Entitätseigenschaft festlegen möchten, können Sie das Entitätsfeld mit dem Standardwert initialisieren.
Sie können beispielsweise das Standardentitätsattribut wie createdOnfolgt auf die aktuelle Zeit festlegen :
@Column(
name ="created_on")privateLocalDateTime createdOn =LocalDateTime.now();
Standardspaltenwert
Wenn Sie das DDL-Schema mit Hibernate generieren, obwohl dies nicht empfohlen wird, können Sie das columnDefinitionAttribut der JPA- @ColumnAnnotation wie folgt verwenden :
@Column(
name ="created_on",
columnDefinition ="DATETIME(6) DEFAULT CURRENT_TIMESTAMP")@Generated(GenerationTime.INSERT)privateLocalDateTime createdOn;
Die @GeneratedAnnotation wird benötigt, da wir Hibernate anweisen möchten, die Entität nach dem Löschen des Persistenzkontexts neu zu laden. Andernfalls wird der datenbankgenerierte Wert nicht mit dem speicherinternen Entitätsstatus synchronisiert.
Anstatt das zu verwenden columnDefinition, sollten Sie ein Tool wie Flyway verwenden und inkrementelle DDL-Migrationsskripte verwenden. Auf diese Weise legen Sie die DEFAULTSQL-Klausel in einem Skript und nicht in einer JPA-Annotation fest.
Weitere Informationen zur Verwendung der @GeneratedAnmerkung finden Sie in diesem Artikel .
Wenn Sie den Standardwert in Bezug auf die Datenbank festlegen möchten, legen Sie einfach fest @Column( columnDefinition = "int default 1")
Wenn Sie jedoch einen Standardwert in Ihrer Java-App festlegen möchten, können Sie diesen für Ihr Klassenattribut wie folgt festlegen: private Integer attribute = 1;
Der obige Vorschlag funktioniert, jedoch nur, wenn die Annotation für die Getter-Methode verwendet wird. Wenn die Anmerkungen dort verwendet werden, wo das Mitglied deklariert ist, geschieht nichts.
@ColumnDefault
Antworten:
Wenn Sie einen echten Datenbankstandardwert wünschen, verwenden Sie
columnDefinition
:Beachten Sie, dass die Zeichenfolge in
columnDefinition
datenbankabhängig ist. Wenn Sie diese Option auswählen, müssen Sie sie auch verwendendynamic-insert
, sodass beim EinfügenHibernate
keine Spalten mitnull
Werten enthalten sind. Andernfalls ist es irrelevant, über Standard zu sprechen.Wenn Sie jedoch keinen Standardwert für die Datenbank, sondern nur einen Standardwert in Ihrem Java-Code möchten, initialisieren Sie Ihre Variable einfach so:
private Integer myColumn = 100;
quelle
org.hibernate.annotations.Entity
ist veraltet.@DynamicInsert
Stattdessen sollte eine Anmerkung verwendet werden.Sie können eine
@PrePersist
Anotation verwenden und den Standardwert in der Phase vor der Persistenz festlegen.Sowas in der Art:
Diese Methode hängt nicht vom Datenbanktyp / der Datenbankversion unter dem Ruhezustand ab. Der Standardwert wird festgelegt, bevor das Zuordnungsobjekt beibehalten wird.
quelle
setMyProperty
das wird von Ihrem Beispiel nicht verwendet. Warum schließen Sie es ein?Was ist mit dem Festlegen eines Standardwerts für das Feld?
Wenn sie einen Wert übergeben, wird dieser überschrieben. Andernfalls haben Sie einen Standardwert.
quelle
Verwenden Sie die Annotation für den Ruhezustand
quelle
Wenn Sie es in der Datenbank tun möchten:
Legen Sie den Standardwert in der Datenbank fest (SQL Server-Beispiel):
Zuordnen der Ruhezustandsdatei:
Siehe, der Schlüssel ist insert = "false" update = "false"
quelle
Eine Lösung besteht darin, Ihren Getter überprüfen zu lassen, ob der Wert, mit dem Sie arbeiten, null ist (oder der nicht initialisierte Status), und wenn er dem entspricht, geben Sie einfach Ihren Standardwert zurück:
quelle
Ich habe danach gesucht und viele Antworten auf den Standardwert für die Spalte gefunden. Wenn Sie den in der SQL-Tabelle definierten Standardwert verwenden möchten, verwenden Sie in @Column Annotation "insertable = false" . einsteckbar
Wenn Sie columnDefination verwenden, funktioniert die Annotation @Column möglicherweise nicht, da sie datenbankabhängig ist.
quelle
Verwenden Sie
@ColumnDefault()
Anmerkungen. Dies ist jedoch nur im Ruhezustand.quelle
Bei der Arbeit mit Oracle habe ich versucht, einen Standardwert für eine Aufzählung einzufügen
Ich fand das Folgende am besten.
quelle
Sie können den Java-Klassenkonstruktor verwenden, um die Standardwerte festzulegen. Beispielsweise:
quelle
So verwenden Sie den Standardwert aus einer beliebigen Tabellenspalte dann müssen Sie
@DynamicInsert
als wahr definieren , sonst definieren Sie nur@DynamicInsert
. Weil der Ruhezustand standardmäßig als wahr gilt. Betrachten Sie als gegebenes Beispiel:quelle
Standardwert der Entitätseigenschaft
Wenn Sie einen Standardwert für die Entitätseigenschaft festlegen möchten, können Sie das Entitätsfeld mit dem Standardwert initialisieren.
Sie können beispielsweise das Standardentitätsattribut wie
createdOn
folgt auf die aktuelle Zeit festlegen :Standardspaltenwert
Wenn Sie das DDL-Schema mit Hibernate generieren, obwohl dies nicht empfohlen wird, können Sie das
columnDefinition
Attribut der JPA-@Column
Annotation wie folgt verwenden :Die
@Generated
Annotation wird benötigt, da wir Hibernate anweisen möchten, die Entität nach dem Löschen des Persistenzkontexts neu zu laden. Andernfalls wird der datenbankgenerierte Wert nicht mit dem speicherinternen Entitätsstatus synchronisiert.Anstatt das zu verwenden
columnDefinition
, sollten Sie ein Tool wie Flyway verwenden und inkrementelle DDL-Migrationsskripte verwenden. Auf diese Weise legen Sie dieDEFAULT
SQL-Klausel in einem Skript und nicht in einer JPA-Annotation fest.quelle
quelle
Ich arbeite mit Hibernate 5 und Postgres, und das hat bei mir funktioniert.
quelle
Wenn Sie den Standardwert in Bezug auf die Datenbank festlegen möchten, legen Sie einfach fest
@Column( columnDefinition = "int default 1")
Wenn Sie jedoch einen Standardwert in Ihrer Java-App festlegen möchten, können Sie diesen für Ihr Klassenattribut wie folgt festlegen:
private Integer attribute = 1;
quelle
Der obige Vorschlag funktioniert, jedoch nur, wenn die Annotation für die Getter-Methode verwendet wird. Wenn die Anmerkungen dort verwendet werden, wo das Mitglied deklariert ist, geschieht nichts.
quelle