Java 如何使用Hibernate设置默认实体属性值
如何在Hibernate字段中设置默认值?如何设置字段的默认值Java 如何使用Hibernate设置默认实体属性值,java,hibernate,orm,entity,default-value,Java,Hibernate,Orm,Entity,Default Value,如何在Hibernate字段中设置默认值?如何设置字段的默认值 private String _foo = "default"; //property here public String Foo 如果它们传递一个值,则该值将被覆盖,否则,您有一个默认值。如果您想要一个真实的数据库默认值,请使用columnDefinition: @Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
private String _foo = "default";
//property here
public String Foo
如果它们传递一个值,则该值将被覆盖,否则,您有一个默认值。如果您想要一个真实的数据库默认值,请使用
columnDefinition
:
@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
请注意,columnDefinition
中的字符串依赖于数据库。另外,如果选择此选项,则必须使用dynamic insert
,这样Hibernate
在insert时就不会包含值为null
的列。否则,谈论违约就无关紧要了
但如果您不想要数据库默认值,而只是Java代码中的默认值,只需像这样初始化变量-
private Integer myColumn=100代码>一种解决方案是让getter检查您使用的任何值是否为null(或其未初始化状态是否为null),如果它等于null,只需返回默认值:
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
如果要在数据库中执行此操作:
alter table entity alter column subentity_uuid set default 'd87ee95b-06f1-52ab-83ed-5d882ae400e6'::uuid;
在数据库中设置默认值(sql server示例):
映射休眠文件:
<hibernate-mapping ....
...
<property name="fieldName" column="columnName" type="Guid" access="field" not-null="false" insert="false" update="false" />
...
您可以使用@PrePersist
anotion并在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;
}
此方法不依赖于Hibernate下的数据库类型/版本。默认值在持久化映射对象之前设置 上述建议有效,但只有在getter方法上使用注释时才有效。如果在声明成员的位置使用注释,则不会发生任何事情
我搜索了这个,找到了许多关于列的默认值的答案。如果要使用SQL表中定义的默认值,请在@column注释中使用“insertable=false”。可插入
@列(名称=columnName,长度=lengthOfColumn,可插入=false)
如果您使用的是ColumnDefinition,则@Column annotation可能无法使用,因为它依赖于数据库。使用Oracle时,我试图为枚举插入默认值
我发现以下方法效果最好
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
您可以使用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
...
}
公共类实体实现可序列化{
专用双字段1
私有整数字段2;
私人T fieldN;
公共实体(){
这个.field1=0.0;
这个.field2=0;
...
此.fieldN=
}
//二传手和接球手
...
}
使用@ColumnDefault()
注释。但这只是hibernate。使用hibernate注释
@ColumnDefault("-1")
private Long clientId;
如果要设置数据库的默认值,只需设置@Column(columnDefinition=“int default 1”)
但如果您打算在java应用程序中设置默认值,则可以在类属性上设置它,如下所示:private Integer attribute=1代码>我正在使用hibernate 5和postgres,这对我来说很有效
@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;
使用表中任意列的默认值。然后必须将@DynamicInsert
定义为true,否则只需定义@DynamicInsert
。因为hibernate默认为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();
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Column(name = "created_on")
@ColumnDefault(value="CURRENT_TIMESTAMP")
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Column(name = "created_on")
@CreationTimestamp
private LocalDateTime createdOn;
使用JPA的默认列值
如果使用JPA和Hibernate生成DDL模式,尽管不建议这样做,但可以使用JPA@Column
注释的columnDefinition
属性,如下所示:
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Column(name = "created_on")
@ColumnDefault(value="CURRENT_TIMESTAMP")
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Column(name = "created_on")
@CreationTimestamp
private LocalDateTime createdOn;
之所以需要注释,是因为我们希望指示Hibernate在刷新持久性上下文后重新加载实体,否则,数据库生成的值将不会与内存中的实体状态同步
与其使用列定义
,不如使用Flyway之类的工具,并使用DDL增量迁移脚本。这样,您将在脚本中设置DEFAULT
SQL子句,而不是在JPA注释中
使用Hibernate的默认列值
如果您将JPA与Hibernate一起使用,那么还可以使用@ColumnDefault
注释,如下所示:
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Column(name = "created_on")
@ColumnDefault(value="CURRENT_TIMESTAMP")
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Column(name = "created_on")
@CreationTimestamp
private LocalDateTime createdOn;
使用Hibernate的默认日期/时间列值
如果将JPA与Hibernate一起使用,并希望设置创建时间戳,则可以使用注释,如下所示:
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Column(name = "created_on")
@ColumnDefault(value="CURRENT_TIMESTAMP")
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Column(name = "created_on")
@CreationTimestamp
private LocalDateTime createdOn;
假设我们有一个包含子实体的实体
在实体上使用insertable=false,updateable=false
可防止实体创建新的子实体并在默认DBMS值之前。但问题是,我们必须始终使用默认值,或者如果我们需要实体包含另一个非默认的子实体,我们必须在运行时尝试将这些注释更改为insertable=true,updateable=true
,因此这似乎不是一个好的路径
在子实体内部,如果在所有列中使用insertable=false,updateable=false
更有意义,那么无论我们使用何种方法,都不会创建更多的子实体(使用@DynamicInsert
,这是不必要的)
可以使用构造函数或setter以各种方式插入默认值,例如默认实体属性值。其他方法,如将JPA与columnDefinition一起使用,其缺点是默认情况下插入null,并且DBMS的默认值不在前面
使用DBMS插入默认值,使用Hibernate插入可选值
但是使用@DynamicInsert
可以避免在插入具有默认值的子实体时向数据库发送null,从而允许插入具有非默认值的子实体
对于插入,此实体是否应使用动态