如何在休眠字段中设置默认值?
@ColumnDefault
如何在休眠字段中设置默认值?
@ColumnDefault
Answers:
如果要使用真实的数据库默认值,请使用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 Server示例):
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”
我对此进行了搜索,并找到许多列默认值的答案。如果要使用SQL表中定义的默认值,则在@Column注释中使用“ insertable = false”。可插入
@Column(名称= columnName,长度= lengthOfColumn,可插入=假)
如果使用columnDefination,则@Column注释可能不起作用,因为它依赖于数据库。
使用Oracle,我试图为枚举插入默认值
我发现以下方法最有效。
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
要使用表中任何列的默认值。那么您必须将其定义@DynamicInsert
为true,否则就只需要定义即可@DynamicInsert
。因为休眠默认情况下为true。考虑给定的示例:
@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();
如果不建议您使用Hibernate生成DDL模式,则可以使用columnDefinition
JPA @Column
批注的属性,如下所示:
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
在@Generated
需要标注,因为我们要指导Hibernate来加载持久化上下文被刷新之后,否则,数据库生成的值将不会与在内存中的实体状态同步的实体。
最好不要使用columnDefinition
,而最好使用Flyway之类的工具,并使用DDL增量迁移脚本。这样,您将DEFAULT
在脚本而不是JPA批注中设置SQL子句。
有关使用
@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应用程序中设置默认值,则可以在class属性上进行设置,如下所示: private Integer attribute = 1;