Вы используете файл конфигурации XML или аннотации?
Бруно
2
Ответ ниже только дают решения JPA, который является правильным , но .for раствор Hibernate см stackoverflow.com/questions/28107554/... вы должны использовать@ColumnDefault
pdem
Ответы:
185
Если вам нужно реальное значение по умолчанию для базы данных, используйте columnDefinition:
Обратите внимание, что строка в columnDefinitionзависит от базы данных. Кроме того, если вы выберете эту опцию, вы должны использовать dynamic-insert, поэтому Hibernateне включает столбцы со nullзначениями при вставке. В противном случае говорить о дефолте не имеет значения.
Но если вам не нужно значение по умолчанию для базы данных, а просто значение по умолчанию в вашем коде Java, просто инициализируйте вашу переменную следующим образом: private Integer myColumn = 100;
С аннотациями: @ org.hibernate.annotations.Entity (dynamicInsert = true)
homaxto
9
В настоящее время org.hibernate.annotations.Entityне рекомендуется. @DynamicInsertвместо этого следует использовать аннотацию.
Яннис
1
Я не рекомендовал бы использовать columnDefinition для этой ситуации, это не переносимо из базы данных в другую, и вам нужно знать конкретный язык SQL вашего сервера.
16:30
@DynamicInsert необходимо добавить в класс pojo базы данных.
Вы можете использовать @PrePersistаннотацию и установить значение по умолчанию на предварительной стадии.
Что-то такое:
//... 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;}
Этот метод не зависит от типа / версии базы данных в Hibernate. Значение по умолчанию устанавливается перед сохранением объекта сопоставления.
Учитывая, что setMyPropertyне используется ваш пример. Почему вы включаете это?
EndermanAPM
Я просто привожу пример спящих аннотаций для стандартного свойства java (приватная переменная с общедоступными методами get / set). Я заметил и исправил одну ошибку ... Отсутствовал строковый тип метода set argumet.
dbricman
30
а как насчет просто установить значение по умолчанию для поля?
Спасибо, это работает. Но мне пришлось воссоздать таблицу.
Рион
1
Это должно быть реальным решением, использование columnDefinition, как предложено в текущем ответе, является суетой, и вы должны включить тип. Аннотация @ColumnDefault, на мой взгляд, намного проще.
дзюдо
7
Если вы хотите сделать это в базе данных:
Установите значение по умолчанию в базе данных (пример сервера sql):
ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] DEFAULT (newid()) FOR [COLUMN_NAME]
Существует проблема для Oracle: если свойство не равно нулю, его значение все еще является значением по умолчанию. Не фактическое значение.
Янгзи
5
Одним из решений является проверка вашего метода получения, чтобы увидеть, является ли любое значение, с которым вы работаете, нулевым (или каким бы не было его неинициализированное состояние), и если оно равно этому, просто верните значение по умолчанию:
Я использую маппер, который вызывает сеттер для моего объекта. Есть ли недостаток в использовании вашего кода на геттере и сеттере?
Эрик Фрэнсис
4
Я искал это и нашел много ответов на значение по умолчанию для столбца. Если вы хотите использовать значение по умолчанию, определенное в таблице SQL, то в аннотации @Column используйте "inserttable = false" . вставной
Вы можете использовать конструктор класса Java для установки значений по умолчанию. Например:
publicclassEntityimplementsSerializable{privateDouble field1
privateInteger field2;private T fieldN;publicEntity(){this.field1=0.0;this.field2=0;...this.fieldN=<your default value>}//Setters and Getters...}
Использовать значение по умолчанию из любого столбца таблицы. тогда вы должны определить @DynamicInsertкак истинное, иначе просто определите @DynamicInsert. Потому что hibernate по умолчанию принимает за истину. Рассмотрим в качестве данного примера:
Если вы хотите установить значение свойства объекта по умолчанию, то вы можете инициализировать поле объекта, используя значение по умолчанию.
Например, вы можете установить createdOnатрибут сущности по умолчанию на текущее время, например так:
@Column(
name ="created_on")privateLocalDateTime createdOn =LocalDateTime.now();
Значение столбца по умолчанию
Если вы генерируете схему DDL с помощью Hibernate, хотя это не рекомендуется, вы можете использовать columnDefinitionатрибут @Columnаннотации JPA , например:
@Column(
name ="created_on",
columnDefinition ="DATETIME(6) DEFAULT CURRENT_TIMESTAMP")@Generated(GenerationTime.INSERT)privateLocalDateTime createdOn;
@GeneratedАннотации необходимы , потому что мы хотим , чтобы инструктировать Hibernate перезагрузить объект после того , как контекст Постоянства промывается, в противном случае, значение базы данных генерироваться не будет синхронизировано с состоянием объекта в памяти.
Вместо использования columnDefinitionлучше использовать такой инструмент, как Flyway, и использовать сценарии пошаговой миграции DDL. Таким образом, вы будете устанавливать предложение DEFAULTSQL в скрипте, а не в аннотации JPA.
Подробнее об использовании @Generatedаннотации читайте в этой статье .
Если вы хотите установить значение по умолчанию в терминах базы данных, просто установите @Column( columnDefinition = "int default 1")
Но если вы намерены установить значение по умолчанию в своем Java-приложении, вы можете установить его в своем атрибуте класса следующим образом: private Integer attribute = 1;
Вышеупомянутое предложение работает, но только если аннотация используется в методе получения. Если аннотации используются там, где член объявлен, ничего не произойдет.
@ColumnDefault
Ответы:
Если вам нужно реальное значение по умолчанию для базы данных, используйте
columnDefinition
:Обратите внимание, что строка в
columnDefinition
зависит от базы данных. Кроме того, если вы выберете эту опцию, вы должны использоватьdynamic-insert
, поэтомуHibernate
не включает столбцы соnull
значениями при вставке. В противном случае говорить о дефолте не имеет значения.Но если вам не нужно значение по умолчанию для базы данных, а просто значение по умолчанию в вашем коде Java, просто инициализируйте вашу переменную следующим образом:
private Integer myColumn = 100;
источник
org.hibernate.annotations.Entity
не рекомендуется.@DynamicInsert
вместо этого следует использовать аннотацию.Вы можете использовать
@PrePersist
аннотацию и установить значение по умолчанию на предварительной стадии.Что-то такое:
Этот метод не зависит от типа / версии базы данных в Hibernate. Значение по умолчанию устанавливается перед сохранением объекта сопоставления.
источник
setMyProperty
не используется ваш пример. Почему вы включаете это?а как насчет просто установить значение по умолчанию для поля?
если они передают значение, оно будет перезаписано, в противном случае у вас будет значение по умолчанию.
источник
использовать спящий аннотации
источник
Если вы хотите сделать это в базе данных:
Установите значение по умолчанию в базе данных (пример сервера sql):
Отображение файла спящего режима:
Видите, ключ вставки = "ложь", обновление = "ложь"
источник
Одним из решений является проверка вашего метода получения, чтобы увидеть, является ли любое значение, с которым вы работаете, нулевым (или каким бы не было его неинициализированное состояние), и если оно равно этому, просто верните значение по умолчанию:
источник
Я искал это и нашел много ответов на значение по умолчанию для столбца. Если вы хотите использовать значение по умолчанию, определенное в таблице SQL, то в аннотации @Column используйте "inserttable = false" . вставной
Если вы используете columnDefination, то аннотация @Column может оказаться неработоспособной, поскольку зависит от базы данных.
источник
Используйте
@ColumnDefault()
аннотацию. Это только спящий режим.источник
Работая с Oracle, я пытался вставить значение по умолчанию для Enum
Я нашел следующее, чтобы работать лучше всего.
источник
Вы можете использовать конструктор класса Java для установки значений по умолчанию. Например:
источник
Использовать значение по умолчанию из любого столбца таблицы. тогда вы должны определить
@DynamicInsert
как истинное, иначе просто определите@DynamicInsert
. Потому что hibernate по умолчанию принимает за истину. Рассмотрим в качестве данного примера:источник
Значение свойства объекта по умолчанию
Если вы хотите установить значение свойства объекта по умолчанию, то вы можете инициализировать поле объекта, используя значение по умолчанию.
Например, вы можете установить
createdOn
атрибут сущности по умолчанию на текущее время, например так:Значение столбца по умолчанию
Если вы генерируете схему DDL с помощью Hibernate, хотя это не рекомендуется, вы можете использовать
columnDefinition
атрибут@Column
аннотации JPA , например:@Generated
Аннотации необходимы , потому что мы хотим , чтобы инструктировать Hibernate перезагрузить объект после того , как контекст Постоянства промывается, в противном случае, значение базы данных генерироваться не будет синхронизировано с состоянием объекта в памяти.Вместо использования
columnDefinition
лучше использовать такой инструмент, как Flyway, и использовать сценарии пошаговой миграции DDL. Таким образом, вы будете устанавливать предложениеDEFAULT
SQL в скрипте, а не в аннотации JPA.источник
источник
Я работаю с Hibernate 5 и Postgres, и это работает со мной.
источник
Если вы хотите установить значение по умолчанию в терминах базы данных, просто установите
@Column( columnDefinition = "int default 1")
Но если вы намерены установить значение по умолчанию в своем Java-приложении, вы можете установить его в своем атрибуте класса следующим образом:
private Integer attribute = 1;
источник
Вышеупомянутое предложение работает, но только если аннотация используется в методе получения. Если аннотации используются там, где член объявлен, ничего не произойдет.
источник