Как установить значение по умолчанию в поле Hibernate?
@ColumnDefault
Как установить значение по умолчанию в поле Hibernate?
@ColumnDefault
Ответы:
Если вам нужно реальное значение по умолчанию для базы данных, используйте columnDefinition:
@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
Обратите внимание, что строка в columnDefinitionзависит от базы данных. Кроме того, если вы выберете эту опцию, вы должны использовать dynamic-insert, поэтому Hibernateне включает столбцы со nullзначениями при вставке. В противном случае говорить о дефолте не имеет значения.
Но если вам не нужно значение по умолчанию для базы данных, а просто значение по умолчанию в вашем коде Java, просто инициализируйте вашу переменную следующим образом: private Integer myColumn = 100;
org.hibernate.annotations.Entityне рекомендуется. @DynamicInsertвместо этого следует использовать аннотацию.
Вы можете использовать @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не используется ваш пример. Почему вы включаете это?
а как насчет просто установить значение по умолчанию для поля?
private String _foo = "default";
//property here
public String Foo
если они передают значение, оно будет перезаписано, в противном случае у вас будет значение по умолчанию.
использовать спящий аннотации
@ColumnDefault("-1")
private Long clientId;
Если вы хотите сделать это в базе данных:
Установите значение по умолчанию в базе данных (пример сервера 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" />
...
Видите, ключ вставки = "ложь", обновление = "ложь"
Одним из решений является проверка вашего метода получения, чтобы увидеть, является ли любое значение, с которым вы работаете, нулевым (или каким бы не было его неинициализированное состояние), и если оно равно этому, просто верните значение по умолчанию:
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
Я искал это и нашел много ответов на значение по умолчанию для столбца. Если вы хотите использовать значение по умолчанию, определенное в таблице SQL, то в аннотации @Column используйте "inserttable = false" . вставной
@Column (name = columnName, length = lengthOfColumn, вставляемый = false)
Если вы используете columnDefination, то аннотация @Column может оказаться неработоспособной, поскольку зависит от базы данных.
Работая с Oracle, я пытался вставить значение по умолчанию для Enum
Я нашел следующее, чтобы работать лучше всего.
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
Вы можете использовать конструктор класса 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
...
}
Использовать значение по умолчанию из любого столбца таблицы. тогда вы должны определить @DynamicInsertкак истинное, иначе просто определите @DynamicInsert. Потому что hibernate по умолчанию принимает за истину. Рассмотрим в качестве данного примера:
@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {
@Column(name = "status", columnDefinition = "int default 100")
private Long status;
}
Если вы хотите установить значение свойства объекта по умолчанию, то вы можете инициализировать поле объекта, используя значение по умолчанию.
Например, вы можете установить 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аннотации читайте в этой статье .
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
Я работаю с Hibernate 5 и Postgres, и это работает со мной.
@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;
Если вы хотите установить значение по умолчанию в терминах базы данных, просто установите @Column( columnDefinition = "int default 1")
Но если вы намерены установить значение по умолчанию в своем Java-приложении, вы можете установить его в своем атрибуте класса следующим образом: private Integer attribute = 1;
Вышеупомянутое предложение работает, но только если аннотация используется в методе получения. Если аннотации используются там, где член объявлен, ничего не произойдет.
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}