如何在Hibernate字段中设置默认值?
如何在Hibernate字段中设置默认值?
如果您想设置真正的数据库默认值,请使用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
注解来代替它。 - jannis使用Hibernate注解。
@ColumnDefault("-1")
private Long clientId;
如果已经存在表格,请重新创建以使更改生效。
hibernate.hbm2ddl.auto
让 Hibernate 自动创建/更新数据库模式时,@ColumnDefault
才有用。如果您不使用此自动生成模式功能,则它将没有任何效果。 - jumping_monkey@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那么只是设置字段的默认值呢?
private String _foo = "default";
//property here
public String Foo
如果他们传递了一个值,那么它将被覆盖,否则,您将拥有一个默认值。
如果您希望设置默认的实体属性值,则可以使用默认值初始化实体字段。
例如,您可以将默认的createdOn
实体属性设置为当前时间,如下所示:
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
如果您使用JPA和Hibernate生成DDL模式,尽管这不被推荐,但您可以使用JPA @Column
注释的columnDefinition
属性来设置默认列值,如下所示:
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@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;
如果您正在使用JPA和Hibernate,并想要设置创建时间戳,则可以使用@CreationTimestamp
注释来实现,如下所示:
@Column(name = "created_on")
@CreationTimestamp
private LocalDateTime createdOn;
@GeneratedValue
只能用于实体标识符。 - Vlad Mihalcea@GeneratedValue
只适用于实体的主键,而 @Generated
适用于原始值。但是,如果一个子实体或外键有像 @OneToOne
这样的注释,我应该使用什么呢?因为这两个注释都对我来说不起作用。 - Braian Coronel@Generated(GenerationTime.INSERT)
会抛出org.springframework.orm.jpa.JpaSystemException: Lock mode not supported; nested exception is org.hibernate.UnsupportedLockAttemptException: Lock mode not supported
异常。 - JavaLearnerALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] DEFAULT (newid()) FOR [COLUMN_NAME]
映射 Hibernate 文件:
<hibernate-mapping ....
...
<property name="fieldName" column="columnName" type="Guid" access="field" not-null="false" insert="false" update="false" />
...
一种解决方案是让您的getter检查您正在使用的任何值是否为null(或其未初始化状态),如果它等于该状态,则只需返回默认值:
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
@ColumnDefault()
注释。这只适用于Hibernate。在使用 Oracle 时,我尝试为枚举类型插入默认值。
我发现以下内容效果最佳。
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
我搜索了一下,发现有很多关于列默认值的答案。如果您想使用在SQL表中定义的默认值,则在@Column注释中使用"insertable = false"。 insertable
@Column(name = columnName, length = lengthOfColumn, insertable = false)
如果您正在使用columnDefination和@Column注释,可能由于它是数据库相关的,它可能不起作用。