Jak ustawić wartość domyślną w polu Hibernacja?
@ColumnDefault
Jak ustawić wartość domyślną w polu Hibernacja?
@ColumnDefault
Odpowiedzi:
Jeśli chcesz prawdziwą domyślną wartość bazy danych, użyj columnDefinition
:
@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
Zwróć uwagę, że ciąg w columnDefinition
jest zależny od bazy danych. Również jeśli wybierzesz tę opcję, musisz użyć dynamic-insert
, więc Hibernate
nie obejmuje kolumn z null
wartościami przy wstawianiu. W przeciwnym razie mówienie o niewypłacalności nie ma znaczenia.
Ale jeśli nie chcesz, aby wartość domyślna bazy danych była po prostu wartością domyślną w kodzie Java, po prostu zainicjuj zmienną w ten sposób - private Integer myColumn = 100;
org.hibernate.annotations.Entity
jest przestarzały. @DynamicInsert
Zamiast tego należy użyć adnotacji.
Możesz użyć @PrePersist
anotacji i ustawić wartość domyślną na etapie przed utrwaleniem.
Coś w tym stylu:
//... 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;
}
Ta metoda nie jest zależna od typu / wersji bazy danych pod Hibernate. Wartość domyślna jest ustawiana przed utrwaleniem obiektu mapowania.
setMyProperty
nie jest to używane w twoim przykładzie. Dlaczego to uwzględniasz?
a co z ustawieniem domyślnej wartości dla tego pola?
private String _foo = "default";
//property here
public String Foo
jeśli przekażą wartość, zostanie ona nadpisana, w przeciwnym razie masz wartość domyślną.
użyj adnotacji hibernacji
@ColumnDefault("-1")
private Long clientId;
Jeśli chcesz to zrobić w bazie danych:
Ustaw wartość domyślną w bazie danych (przykład serwera sql):
ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] DEFAULT (newid()) FOR [COLUMN_NAME]
Mapowanie pliku hibernacji:
<hibernate-mapping ....
...
<property name="fieldName" column="columnName" type="Guid" access="field" not-null="false" insert="false" update="false" />
...
Widzisz, klucz to insert = "false" update = "false"
Jednym z rozwiązań jest sprawdzenie przez getter, czy jakakolwiek wartość, z którą pracujesz, jest zerowa (lub jakikolwiek byłby jej niezainicjowany stan), a jeśli jest równa temu, po prostu zwróć wartość domyślną:
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
Szukałem tego i znalazłem wiele odpowiedzi na domyślną wartość kolumny. Jeśli chcesz użyć domyślnej wartości zdefiniowanej w tabeli SQL, to w @Column Annotation użyj " insertable = false" . wkładany
@Column (name = columnName, length = lengthOfColumn, insertable = false)
Jeśli używasz columnDefination it @Column adnotacja może nie działać, ponieważ jest zależna od bazy danych.
Pracując z Oracle, próbowałem wstawić domyślną wartość dla Enum
Uważam, że najlepiej działają następujące.
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
Możesz użyć konstruktora klasy java, aby ustawić wartości domyślne. Na przykład:
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
...
}
Aby użyć wartości domyślnej z dowolnej kolumny tabeli. wtedy musisz zdefiniować @DynamicInsert
jako prawdę albo po prostu zdefiniować @DynamicInsert
. Ponieważ hibernacja domyślnie przyjmuje wartość true. Rozważ jako podany przykład:
@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {
@Column(name = "status", columnDefinition = "int default 100")
private Long status;
}
Jeśli chcesz ustawić domyślną wartość właściwości jednostki, możesz zainicjować pole jednostki przy użyciu wartości domyślnej.
Na przykład możesz ustawić domyślny createdOn
atrybut encji na bieżący czas, na przykład:
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
Jeśli generujesz schemat DDL za pomocą Hibernate, chociaż nie jest to zalecane, możesz użyć columnDefinition
atrybutu @Column
adnotacji JPA , na przykład:
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Generated
Potrzebna jest adnotacja, ponieważ chcemy pouczać Hibernate przeładować podmiot po Kontekst Trwałość jest zaczerwieniona, w przeciwnym razie, wartość bazy danych generowanych nie zostaną zsynchronizowane ze stanem jednostki w pamięci.
Zamiast używać columnDefinition
, lepiej jest użyć narzędzia takiego jak Flyway i użyć skryptów przyrostowej migracji DDL. W ten sposób ustawisz DEFAULT
klauzulę SQL w skrypcie, a nie w adnotacji JPA.
Więcej informacji na temat korzystania z
@Generated
adnotacji znajdziesz w tym artykule .
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
pracuję z hibernate 5 i postgres, i to zadziałało u mnie.
@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;
Jeśli chcesz ustawić domyślną wartość w zakresie bazy danych, po prostu ustaw @Column( columnDefinition = "int default 1")
Ale jeśli zamierzasz ustawić domyślną wartość w aplikacji java, możesz ustawić ją w atrybucie klasy w następujący sposób: private Integer attribute = 1;
Powyższa sugestia działa, ale tylko wtedy, gdy adnotacja jest używana w metodzie pobierającej. Jeśli adnotacje są używane w miejscu zadeklarowania elementu członkowskiego, nic się nie stanie.
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}