如何使用Hibernate设置默认实体属性值


Answers:


185

如果要使用真实的数据库默认值,请使用columnDefinition

@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100") 

注意,其中的字符串columnDefinition取决于数据库。同样,如果选择此选项,则必须使用dynamic-insert,因此Hibernate不包括null在插入时带有值的列。否则谈论默认是不相关的。

但是,如果您不希望数据库默认值,而只是Java代码中的默认值,则可以像这样初始化变量- private Integer myColumn = 100;


6
带有注释:@ org.hibernate.annotations.Entity(dynamicInsert = true)
homaxto 2011年

9
目前org.hibernate.annotations.Entity已弃用。@DynamicInsert应该使用注释代替。
jannis

1
在这种情况下,我不建议使用columnDefinition,因为它不能从数据库移植到另一个数据库,并且您需要了解服务器的特定SQL语言。
pdem '16

@DynamicInsert需要添加到数据库pojo类上。
Reaz Murshed

3
我建议使用@ColumnDefault而不是columnDefinition,因为它更独立
jalsh

35

您可以使用@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您的示例未使用该功能。为什么要包含它?
EndermanAPM

我只给出标准Java属性(带有公共get / set方法的私有变量)的休眠注释示例。我注意到并纠正了一个错误...缺少set方法argumet的字符串类型。
dbricman

30

只为该字段设置默认值怎么办?

private String _foo = "default";

//property here
public String Foo

如果他们传递一个值,那么它将被覆盖,否则,您将使用默认值。


8
@michali:默认值的作用并不妨碍更新值,是吗?
Janusz Lenar'9

27

使用休眠注释

@ColumnDefault("-1")
private Long clientId;

谢谢,它有效。但是我不得不重新创建表。
Yamashiro Rion

1
这应该是真正的解决方案,使用当前答案提出的columnDefinition是一个麻烦,您必须包括该类型。在我看来,注解@ColumnDefault更容易。
judos

7

如果要在数据库中执行此操作:

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


Oracle存在一个问题:如果该属性不为null,则其值STILL为默认值。不是实际值。
youngzy '16

5

一种解决方案是让您的吸气剂检查您正在使用的任何值是否为空(或它的未初始化状态为空),并且如果它等于该值,则只需返回默认值即可:

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}

我正在使用一个映射器,该映射器在我的实体对象上调用设置器。在getter和setter上使用代码段是否有不利之处?
埃里克·弗朗西斯

4

我对此进行了搜索,并找到许多列默认值的答案。如果要使用SQL表中定义的默认值,则在@Column注释中使用“ insertable = false”。可插入

@Column(名称= columnName,长度= lengthOfColumn,可插入=假)

如果使用columnDefination,则@Column注释可能不起作用,因为它依赖于数据库。


这对于像“ createdAt”这样的列非常有用,在这些列中您总是要使用数据库默认值。谢谢!
米歇尔·菲利普

4

使用@ColumnDefault()注释。虽然这只是休眠。



2

您可以使用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
...

}

2

要使用表中任何列的默认值。那么您必须将其定义@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;

}

2

默认实体属性值

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

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

@Column(
    name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();

默认列值

如果不建议您使用Hibernate生成DDL模式,则可以使用columnDefinitionJPA @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注释的更多详细信息,请参阅本文



1

我正在使用hibernate 5和postgres,这对我来说很有效。

@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;

0

如果要根据数据库设置默认值,只需设置 @Column( columnDefinition = "int default 1")

但是,如果您打算在Java应用程序中设置默认值,则可以在class属性上进行设置,如下所示: private Integer attribute = 1;


-3

以上建议有效,但前提是在getter方法上使用了注释。如果在声明成员的地方使用了注释,则不会发生任何事情。

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.