Wie lege ich einen Standardwert im Feld "Ruhezustand" fest?
@ColumnDefault
Wie lege ich einen Standardwert im Feld "Ruhezustand" fest?
@ColumnDefault
Antworten:
Wenn Sie einen echten Datenbankstandardwert wünschen, verwenden Sie columnDefinition
:
@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
Beachten Sie, dass die Zeichenfolge in columnDefinition
datenbankabhängig ist. Wenn Sie diese Option auswählen, müssen Sie sie auch verwenden dynamic-insert
, sodass beim Einfügen Hibernate
keine Spalten mit null
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;
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:
//... some code
private String myProperty;
//... some code
@PrePersist
public void 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.
public String getMyProperty() {
return myProperty;
}
public void 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.
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?
private String _foo = "default";
//property here
public String Foo
Wenn sie einen Wert übergeben, wird dieser überschrieben. Andernfalls haben Sie einen Standardwert.
Verwenden Sie die Annotation für den Ruhezustand
@ColumnDefault("-1")
private Long clientId;
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]
Zuordnen der Ruhezustandsdatei:
<hibernate-mapping ....
...
<property name="fieldName" column="columnName" type="Guid" access="field" not-null="false" insert="false" update="false" />
...
Siehe, der Schlüssel ist insert = "false" update = "false"
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:
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
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
@Column (name = columnName, length = lengthOfColumn, insertable = false)
Wenn Sie columnDefination verwenden, funktioniert die Annotation @Column möglicherweise nicht, da sie datenbankabhängig ist.
Bei der Arbeit mit Oracle habe ich versucht, einen Standardwert für eine Aufzählung einzufügen
Ich fand das Folgende am besten.
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
Sie können den Java-Klassenkonstruktor verwenden, um die Standardwerte festzulegen. Beispielsweise:
public class Entity implements Serializable{
private Double field1
private Integer field2;
private T fieldN;
public Entity(){
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 @DynamicInsert
als wahr definieren , sonst definieren Sie nur @DynamicInsert
. Weil der Ruhezustand standardmäßig als wahr gilt. Betrachten Sie als gegebenes Beispiel:
@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {
@Column(name = "status", columnDefinition = "int default 100")
private Long status;
}
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 :
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
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 :
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
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 die DEFAULT
SQL-Klausel in einem Skript und nicht in einer JPA-Annotation fest.
Weitere Informationen zur Verwendung der
@Generated
Anmerkung finden Sie in diesem Artikel .
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
Ich arbeite mit Hibernate 5 und Postgres, und das hat bei mir funktioniert.
@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;
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.
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}