Как установить значение свойства объекта по умолчанию с Hibernate


145

Как установить значение по умолчанию в поле Hibernate?


3
Вы используете файл конфигурации XML или аннотации?
Бруно

2
Ответ ниже только дают решения JPA, который является правильным , но .for раствор Hibernate см 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вместо этого следует использовать аннотацию.
Яннис

1
Я не рекомендовал бы использовать columnDefinition для этой ситуации, это не переносимо из базы данных в другую, и вам нужно знать конкретный язык SQL вашего сервера.
16:30

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

3
Я бы рекомендовал использовать @ColumnDefault вместо columnDefinition, так как он более независим от базы данных. Docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/…
jalsh

35

Вы можете использовать @PrePersistаннотацию и установить значение по умолчанию на предварительной стадии.

Что-то такое:

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

Этот метод не зависит от типа / версии базы данных в Hibernate. Значение по умолчанию устанавливается перед сохранением объекта сопоставления.


Учитывая, что setMyPropertyне используется ваш пример. Почему вы включаете это?
EndermanAPM

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

30

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

private String _foo = "default";

//property here
public String Foo

если они передают значение, оно будет перезаписано, в противном случае у вас будет значение по умолчанию.


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

27

использовать спящий аннотации

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

Спасибо, это работает. Но мне пришлось воссоздать таблицу.
Рион

1
Это должно быть реальным решением, использование columnDefinition, как предложено в текущем ответе, является суетой, и вы должны включить тип. Аннотация @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"  />
    ...

Видите, ключ вставки = "ложь", обновление = "ложь"


Существует проблема для Oracle: если свойство не равно нулю, его значение все еще является значением по умолчанию. Не фактическое значение.
Янгзи

5

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

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

Я использую маппер, который вызывает сеттер для моего объекта. Есть ли недостаток в использовании вашего кода на геттере и сеттере?
Эрик Фрэнсис

4

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

@Column (name = columnName, length = lengthOfColumn, вставляемый = false)

Если вы используете columnDefination, то аннотация @Column может оказаться неработоспособной, поскольку зависит от базы данных.


Это прекрасно работает для столбцов, таких как «createAt», где вы всегда хотите использовать базу данных по умолчанию. Спасибо!
Михал Филип

4

Используйте @ColumnDefault()аннотацию. Это только спящий режим.


2

Работая с Oracle, я пытался вставить значение по умолчанию для 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. Потому что hibernate по умолчанию принимает за истину. Рассмотрим в качестве данного примера:

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

@GeneratedАннотации необходимы , потому что мы хотим , чтобы инструктировать Hibernate перезагрузить объект после того , как контекст Постоянства промывается, в противном случае, значение базы данных генерироваться не будет синхронизировано с состоянием объекта в памяти.

Вместо использования columnDefinitionлучше использовать такой инструмент, как Flyway, и использовать сценарии пошаговой миграции DDL. Таким образом, вы будете устанавливать предложение DEFAULTSQL в скрипте, а не в аннотации JPA.

Подробнее об использовании @Generatedаннотации читайте в этой статье .



1

Я работаю с Hibernate 5 и Postgres, и это работает со мной.

@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

Вышеупомянутое предложение работает, но только если аннотация используется в методе получения. Если аннотации используются там, где член объявлен, ничего не произойдет.

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