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


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;


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.


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


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;

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"


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;
}

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.


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.


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;

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

}

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;

}

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 .



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;

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;


-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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.