Як встановити значення за замовчуванням у полі сплячки?
@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замість цього слід використовувати анотацію.
Ви можете використовувати @PrePersistanotation та встановити значення за замовчуванням у попередньо збереженому етапі.
Щось схоже:
//... 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;
}