Как установить значение по умолчанию в поле 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. Таким образом, вы будете устанавливать предложение DEFAULT
SQL в скрипте, а не в аннотации 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;
}