Як встановити значення за замовчуванням у полі сплячки?
@ColumnDefault
Як встановити значення за замовчуванням у полі сплячки?
@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
anotation та встановити значення за замовчуванням у попередньо збереженому етапі.
Щось схоже:
//... 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
не використовується вашим прикладом. Чому ви включаєте його?
а як тільки встановити значення поля за замовчуванням для поля?
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" />
...
Дивіться, ключ є insert = "false" update = "false"
Одним із варіантів є отримання перевірки на отримання перевірки, чи є значення, з яким ви працюєте, недійсне (або як би це було неініціалізований стан), і якщо воно дорівнює цьому, просто поверніть своє значення за замовчуванням:
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
Я шукав це і знайшов багато відповідей на значення за замовчуванням для стовпця. Якщо ви хочете використовувати значення за замовчуванням, визначене в таблиці SQL, то в анотації @Column використовуйте "inserttable = false" . вставні
@Column (ім'я = стовпецьНазву, length = lengthOfColumn, вставний = false)
Якщо ви використовуєте columnDefination, це може бути анотацією @Column, вона не працюватиме, оскільки залежить від бази даних.
Працюючи з Oracle, я намагався вставити значення Enum за замовчуванням для 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
. Тому що сплячка приймає за замовчуванням справжню. Розглянемо як даний приклад:
@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;
The @Generated
Анотації необхідні , тому що ми хочемо , щоб інструктувати Hibernate перезавантажити об'єкт після того , як контекст Постійність промивається, в іншому випадку, значення бази даних генеруватися НЕ буде синхронізовано зі станом об'єкта в пам'яті.
Замість того, щоб використовувати columnDefinition
, вам краще використовувати такий інструмент, як Flyway і використовувати сценарії DDL для додаткової міграції. Таким чином, ви встановите DEFAULT
пункт SQL у сценарії, а не в анотації JPA.
Детальніше про використання
@Generated
примітки див. У цій статті .
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
Я працюю зі сплячою сплячкою 5 і постгресами, і це працювало у мене.
@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;
Вищенаведена пропозиція працює, але лише в тому випадку, якщо анотація використовується за методом getter. Якщо анотації використовуються там, де заявлений член, нічого не відбудеться.
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}