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:
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;
Możesz użyć @PrePersistanotacji i ustawić wartość domyślną na etapie przed utrwaleniem.
Coś w tym stylu:
//... 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;}
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?
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]
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ą:
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
Możesz użyć konstruktora klasy java, aby ustawić wartości domyślne. Na przykład:
publicclassEntityimplementsSerializable{privateDouble field1
privateInteger field2;private T fieldN;publicEntity(){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ć @DynamicInsertjako prawdę albo po prostu zdefiniować @DynamicInsert. Ponieważ hibernacja domyślnie przyjmuje wartość true. Rozważ jako podany przykład:
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")privateLocalDateTime 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)privateLocalDateTime 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 .
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.
@ColumnDefault
Odpowiedzi:
Jeśli chcesz prawdziwą domyślną wartość bazy danych, użyj
columnDefinition
: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ęcHibernate
nie obejmuje kolumn znull
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;
źródło
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:
Ta metoda nie jest zależna od typu / wersji bazy danych pod Hibernate. Wartość domyślna jest ustawiana przed utrwaleniem obiektu mapowania.
źródło
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?
jeśli przekażą wartość, zostanie ona nadpisana, w przeciwnym razie masz wartość domyślną.
źródło
użyj adnotacji hibernacji
źródło
Jeśli chcesz to zrobić w bazie danych:
Ustaw wartość domyślną w bazie danych (przykład serwera sql):
Mapowanie pliku hibernacji:
Widzisz, klucz to insert = "false" update = "false"
źródło
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ą:
źródło
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
Jeśli używasz columnDefination it @Column adnotacja może nie działać, ponieważ jest zależna od bazy danych.
źródło
Użyj
@ColumnDefault()
adnotacji. Jest to jednak tylko hibernacja.źródło
Pracując z Oracle, próbowałem wstawić domyślną wartość dla Enum
Uważam, że najlepiej działają następujące.
źródło
Możesz użyć konstruktora klasy java, aby ustawić wartości domyślne. Na przykład:
źródło
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:źródło
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
createdOn
atrybut encji na bieżący czas, na przykład:Domyślna wartość kolumny
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:@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 ustawiszDEFAULT
klauzulę SQL w skrypcie, a nie w adnotacji JPA.źródło
źródło
pracuję z hibernate 5 i postgres, i to zadziałało u mnie.
źródło
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;
źródło
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.
źródło