如何在Hibernate中设置默认值

Dej*_*ell 129 java hibernate

如何在Hibernate字段中设置默认值?

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;

  • 目前,不推荐使用`org.hibernate.annotations.Entity`.应该使用`@FynamicInsert`注释. (9认同)
  • 带注释:@ org.hibernate.annotations.Entity(dynamicInsert = true) (6认同)
  • 我建议使用 @ColumnDefault 而不是 columnDefinition 因为它更独立于数据库 https://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/annotations/ColumnDefault.html (6认同)
  • 我不建议在这种情况下使用 columnDefinition,这不能从数据库移植到另一个数据库,并且您需要知道服务器的特定 SQL 语言。 (2认同)

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)

如果他们传递一个值,那么它将被覆盖,否则,你有一个默认值.

  • 这并不会阻止某人在某些时候将其设置为null. (13认同)
  • @michali:默认值的作用是不阻止更新值,是吗? (7认同)

Maz*_*aby 19

使用hibernate注释

@ColumnDefault("-1")
private Long clientId;
Run Code Online (Sandbox Code Playgroud)

  • 这应该是真正的解决方案,使用当前答案提出的 columnDefinition 很麻烦,您必须包含类型。我认为注释 @ColumnDefault 更容易。 (4认同)

CSA*_*CSA 7

如果你想在数据库中这样做:

在数据库中设置默认值(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"


Vla*_*cea 7

默认实体属性值

如果要设置默认实体属性值,则可以使用默认值初始化实体字段。

例如,您可以将默认createdOn实体属性设置为当前时间,如下所示:

@Column(
    name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
Run Code Online (Sandbox Code Playgroud)

使用 JPA 的默认列值

如果您使用 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 的默认列值

如果您在 Hibernate 中使用 JPA,那么您也可以使用@ColumnDefault注释,如下所示:

@Column(name = "created_on")
@ColumnDefault(value="CURRENT_TIMESTAMP")
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
Run Code Online (Sandbox Code Playgroud)

使用 Hibernate 的默认日期/时间列值

如果您在 Hibernate 中使用 JPA 并希望设置创建时间戳,那么您可以使用@CreationTimestamp注释,如下所示:

@Column(name = "created_on")
@CreationTimestamp
private LocalDateTime createdOn;
Run Code Online (Sandbox Code Playgroud)


Ian*_*las 5

一种解决方案是让你的getter检查你正在使用的值是否为null(或者它的非初始化状态是什么),如果它等于那个,只需返回你的默认值:

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}
Run Code Online (Sandbox Code Playgroud)


T3r*_*rm1 5

使用@ColumnDefault()注释。这只是休眠状态。