Jak ustawić domyślną wartość właściwości encji za pomocą Hibernate

145

Jak ustawić wartość domyślną w polu Hibernacja?

Dejell
źródło
3
Czy używasz pliku konfiguracyjnego XML lub adnotacji?
Bruno,
2
Poniższa odpowiedź podaje tylko rozwiązania JPA, które są poprawne, ale. Dla rozwiązania Hibernate patrz stackoverflow.com/questions/28107554/ ... musisz użyć@ColumnDefault
pdem

Odpowiedzi:

185

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 columnDefinitionjest zależny od bazy danych. Również jeśli wybierzesz tę opcję, musisz użyć dynamic-insert, więc Hibernatenie obejmuje kolumn z nullwartoś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;

Petar Minchev
źródło
6
Z adnotacjami: @ org.hibernate.annotations.Entity (dynamicInsert = true)
homaxto
9
Obecnie org.hibernate.annotations.Entityjest przestarzały. @DynamicInsertZamiast tego należy użyć adnotacji.
jannis
1
Nie polecam używania columnDefinition w tej sytuacji, nie jest to przenośne z bazy danych do innej i musisz znać konkretny język SQL swojego serwera.
pdem
@DynamicInsert należy dodać do klasy pojo bazy danych.
Reaz Murshed
3
Polecam używanie @ColumnDefault zamiast columnDefinition, ponieważ jest to bardziej niezależne od bazy danych docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/ ...
jalsh
35

Możesz użyć @PrePersistanotacji 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.

dbricman
źródło
Biorąc pod uwagę, że setMyPropertynie jest to używane w twoim przykładzie. Dlaczego to uwzględniasz?
EndermanAPM
Podaję tylko przykład adnotacji hibernacji dla standardowej właściwości java (prywatna zmienna z publicznymi metodami get / set). Zauważyłem i poprawiłem jeden błąd ... Brakowało typu string metody set argumet.
dbricman
30

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ą.

Tim Hoolihan
źródło
8
@michali: rola wartości domyślnej nie uniemożliwia aktualizacji wartości, prawda?
Janusz Lenar
27

użyj adnotacji hibernacji

@ColumnDefault("-1")
private Long clientId;
Mazen Embaby
źródło
Dziękuję, działa. Ale musiałem odtworzyć stół.
Yamashiro Rion
1
To powinno być prawdziwe rozwiązanie, użycie columnDefinition zgodnie z obecną odpowiedzią to pośpiech i musisz uwzględnić typ. Adnotacja @ColumnDefault jest moim zdaniem znacznie łatwiejsza.
judo
7

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"

CSA
źródło
Występuje problem dotyczący Oracle: jeśli właściwość nie jest pusta, jej wartość NADAL jest wartością domyślną. Nie rzeczywista wartość.
youngzy
5

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;
}
Ian Dallas
źródło
Używam programu odwzorowującego, który wywołuje metodę ustawiającą na moim obiekcie jednostki. Czy jest wada używania fragmentu kodu zarówno w funkcji pobierającej, jak i ustawiającej?
Eric Francis
4

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.

Garvit Bansal
źródło
Działa to świetnie w przypadku kolumn takich jak „createdAt”, w których zawsze chcesz używać domyślnej bazy danych. Dzięki!
Michał Filip
4

Użyj @ColumnDefault()adnotacji. Jest to jednak tylko hibernacja.

T3rm1
źródło
2

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;
Bojan Petkovic
źródło
2

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
...

}
IKavanagh
źródło
2

Aby użyć wartości domyślnej z dowolnej kolumny tabeli. wtedy musisz zdefiniować @DynamicInsertjako 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;

}
Dilip Verma
źródło
2

Domyślna wartość właściwości jednostki

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 createdOnatrybut encji na bieżący czas, na przykład:

@Column(
    name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();

Domyślna wartość kolumny

Jeśli generujesz schemat DDL za pomocą Hibernate, chociaż nie jest to zalecane, możesz użyć columnDefinitionatrybutu @Columnadnotacji JPA , na przykład:

@Column(
    name = "created_on", 
    columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;

@GeneratedPotrzebna 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 DEFAULTklauzulę SQL w skrypcie, a nie w adnotacji JPA.

Więcej informacji na temat korzystania z @Generatedadnotacji znajdziesz w tym artykule .

Vlad Mihalcea
źródło
1

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;
Ala Messaoudi
źródło
0

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;

Edgencio Da Calista
źródło
-3

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;
}
user1310789
źródło