Як встановити значення властивості об'єкта за замовчуванням за допомогою Hibernate


145

Як встановити значення за замовчуванням у полі сплячки?


3
Ви використовуєте конфігураційний файл XML або примітки?
Бруно

2
Відповідь нижче надайте лише рішення JPA, що є правильним, але. Для рішення в режимі глибокого сну див. Stackoverflow.com/questions/28107554/…, яке вам потрібно використовувати@ColumnDefault
pdem

Відповіді:


185

Якщо ви хочете отримати реальне значення за замовчуванням у базі даних, використовуйте columnDefinition:

@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100") 

Зауважте, що рядок у columnDefinitionбазі даних залежить від бази даних. Також якщо ви виберете цей параметр, вам доведеться використовувати dynamic-insert, тому Hibernateне включайте стовпці зі nullзначеннями на вставці. Інакше говорити про дефолт не має значення.

Але якщо ви не хочете значення за замовчуванням у базі даних, а просто значення за замовчуванням у вашому коді Java, просто ініціалізуйте подібну змінну - private Integer myColumn = 100;


6
Із анотаціями: @ org.hibernate.annotations.Entity (dynamicInsert = true)
homaxto

9
Наразі org.hibernate.annotations.Entityзастаріла. @DynamicInsertзамість цього слід використовувати анотацію.
jannis

1
Я б не рекомендував використовувати колонкуDefinition для цієї ситуації, це не переноситься з бази даних в іншу, і вам потрібно знати конкретну мову SQL вашого сервера.
пдем

@DynamicInsert потрібно додати в клас pojo бази даних.
Реаз Муршед

3
Я рекомендую використовувати @ColumnDefault замість columnDefinition, оскільки це більш незалежна база даних docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/…
jalsh

35

Ви можете використовувати @PrePersistanotation та встановити значення за замовчуванням у попередньо збереженому етапі.

Щось схоже:

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

Цей метод не залежить від типу / версії бази даних під сплячим режимом. Значення за замовчуванням встановлюється перед збереженням об’єкта відображення.


З огляду на те, що setMyPropertyне використовується вашим прикладом. Чому ви включаєте його?
EndermanAPM

Я просто навожу приклад сплячих анотацій для стандартних властивостей java (приватна змінна з публічними методами get / set). Я помітив та виправив одну помилку ... Тип рядка заданого методу argumet відсутній.
dbricman

30

а як тільки встановити значення поля за замовчуванням для поля?

private String _foo = "default";

//property here
public String Foo

якщо вони передають значення, то воно буде перезаписане, інакше у вас є за замовчуванням.


8
@michali: роль значення за замовчуванням не заважає оновити значення, чи не так?
Януш Ленар

27

використовувати сплячу анотацію

@ColumnDefault("-1")
private Long clientId;

Дякую, це працює. Але мені довелося відтворити стіл.
Ріон

1
Це повинно бути справжнім рішенням, використовуючи колонкуDefinition, як запропоновано поточною відповіддю, - це хаст, і ви повинні включити тип. Анотація @ColumnDefault на мою думку набагато простіше.
дзюдо

7

Якщо ви хочете зробити це в базі даних:

Встановіть значення за замовчуванням у базі даних (зразок сервера sql):

ALTER TABLE [TABLE_NAME] ADD  CONSTRAINT [CONSTRAINT_NAME]  DEFAULT (newid()) FOR [COLUMN_NAME]

Відмітка зі сплячого файла:

    <hibernate-mapping ....
    ...    
    <property name="fieldName" column="columnName" type="Guid" access="field" not-null="false"  insert="false" update="false"  />
    ...

Дивіться, ключ є insert = "false" update = "false"


Існує проблема для Oracle: Якщо властивість не є нульовою, її значення ВИНАГЛЯЄ значення за замовчуванням. Не фактичне значення.
молодий

5

Одним із варіантів є отримання перевірки на отримання перевірки, чи є значення, з яким ви працюєте, недійсне (або як би це було неініціалізований стан), і якщо воно дорівнює цьому, просто поверніть своє значення за замовчуванням:

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}

Я використовую картограф, який викликає сетер на мій об'єкт сутності. Чи є недолік використання фрагмента коду як на геттері, так і на сетері?
Ерік Френсіс

4

Я шукав це і знайшов багато відповідей на значення за замовчуванням для стовпця. Якщо ви хочете використовувати значення за замовчуванням, визначене в таблиці SQL, то в анотації @Column використовуйте "inserttable = false" . вставні

@Column (ім'я = стовпецьНазву, length = lengthOfColumn, вставний = false)

Якщо ви використовуєте columnDefination, це може бути анотацією @Column, вона не працюватиме, оскільки залежить від бази даних.


Це чудово підходить для стовпців типу "createdAt", де завжди потрібно використовувати за замовчуванням БД. Дякую!
Міхал Філіп

4

Використовуйте @ColumnDefault()примітку. Це тільки в сплячому режимі.


2

Працюючи з Oracle, я намагався вставити значення Enum за замовчуванням для Enum

Я знайшов наступне, щоб працювати найкраще.

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;

2

Ви можете використовувати конструктор класу java для встановлення значень за замовчуванням. Наприклад:

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

Використовувати значення за замовчуванням з будь-якого стовпця таблиці. тоді вам потрібно визначити @DynamicInsertяк істинне, інакше ви просто визначите @DynamicInsert. Тому що сплячка приймає за замовчуванням справжню. Розглянемо як даний приклад:

@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {

    @Column(name = "status", columnDefinition = "int default 100")
    private Long status;

}

2

Значення властивості об'єкта за замовчуванням

Якщо ви хочете встановити значення властивості об'єкта за замовчуванням, ви можете ініціалізувати поле сутності, використовуючи значення за замовчуванням.

Наприклад, ви можете встановити createdOnатрибут сутності за замовчуванням на поточний час, наприклад:

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

Значення стовпця за замовчуванням

Якщо ви генеруєте схему DDL за допомогою Hibernate, хоча це не рекомендується, ви можете використовувати columnDefinitionатрибут @Columnанотації JPA , наприклад:

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

The @GeneratedАнотації необхідні , тому що ми хочемо , щоб інструктувати Hibernate перезавантажити об'єкт після того , як контекст Постійність промивається, в іншому випадку, значення бази даних генеруватися НЕ буде синхронізовано зі станом об'єкта в пам'яті.

Замість того, щоб використовувати columnDefinition, вам краще використовувати такий інструмент, як Flyway і використовувати сценарії DDL для додаткової міграції. Таким чином, ви встановите DEFAULTпункт SQL у сценарії, а не в анотації JPA.

Детальніше про використання @Generatedпримітки див. У цій статті .



1

Я працюю зі сплячою сплячкою 5 і постгресами, і це працювало у мене.

@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;

0

Якщо ви хочете встановити значення за замовчуванням з точки зору бази даних, просто встановіть @Column( columnDefinition = "int default 1")

Але якщо у вашій програмі java встановлено значення за замовчуванням, ви можете встановити його за таким атрибутом класу: private Integer attribute = 1;


-3

Вищенаведена пропозиція працює, але лише в тому випадку, якщо анотація використовується за методом getter. Якщо анотації використовуються там, де заявлений член, нічого не відбудеться.

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.