Pet*_*hev 174
如果您想要一个真正的数据库默认值,请使用columnDefinition:
@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
Run Code Online (Sandbox Code Playgroud)
请注意,字符串columnDefinition是依赖于数据库的.此外,如果选择此选项,则必须使用dynamic-insert,因此Hibernate不包括null插入值的列.否则谈论默认是无关紧要的.
但是如果您不想要数据库默认值,而只需要Java代码中的默认值,那么只需初始化您的变量 - private Integer myColumn = 100;
dbr*_*man 31
您可以使用@PrePersist anotation并在pre-persist阶段设置默认值.
像这样的东西:
//... 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;
}
Run Code Online (Sandbox Code Playgroud)
此方法不依赖于Hibernate下的数据库类型/版本.在持久化映射对象之前设置默认值.
Tim*_*han 30
那么只为字段设置默认值呢?
private String _foo = "default";
//property here
public String Foo
Run Code Online (Sandbox Code Playgroud)
如果他们传递一个值,那么它将被覆盖,否则,你有一个默认值.
Maz*_*aby 19
使用hibernate注释
@ColumnDefault("-1")
private Long clientId;
Run Code Online (Sandbox Code Playgroud)
如果你想在数据库中这样做:
在数据库中设置默认值(sql server sample):
ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] DEFAULT (newid()) FOR [COLUMN_NAME]
Run Code Online (Sandbox Code Playgroud)
映射hibernate文件:
<hibernate-mapping ....
...
<property name="fieldName" column="columnName" type="Guid" access="field" not-null="false" insert="false" update="false" />
...
Run Code Online (Sandbox Code Playgroud)
看,关键是insert ="false"update ="false"
如果要设置默认实体属性值,则可以使用默认值初始化实体字段。
例如,您可以将默认createdOn实体属性设置为当前时间,如下所示:
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
Run Code Online (Sandbox Code Playgroud)
如果您使用 JPA 和 Hibernate 生成 DDL 模式,虽然不推荐这样做,但您可以使用columnDefinitionJPA@Column注释的属性,如下所示:
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
Run Code Online (Sandbox Code Playgroud)
在@Generated需要标注,因为我们要指导Hibernate来加载持久化上下文被刷新之后,否则,数据库生成的值将不会与在内存中的实体状态同步的实体。
与其使用columnDefinition,不如使用 Flyway 之类的工具并使用 DDL 增量迁移脚本。这样,您将DEFAULT在脚本中设置SQL 子句,而不是在 JPA 注释中。
如果您在 Hibernate 中使用 JPA,那么您也可以使用@ColumnDefault注释,如下所示:
@Column(name = "created_on")
@ColumnDefault(value="CURRENT_TIMESTAMP")
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
Run Code Online (Sandbox Code Playgroud)
如果您在 Hibernate 中使用 JPA 并希望设置创建时间戳,那么您可以使用@CreationTimestamp注释,如下所示:
@Column(name = "created_on")
@CreationTimestamp
private LocalDateTime createdOn;
Run Code Online (Sandbox Code Playgroud)
一种解决方案是让你的getter检查你正在使用的值是否为null(或者它的非初始化状态是什么),如果它等于那个,只需返回你的默认值:
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
Run Code Online (Sandbox Code Playgroud)