如何在Hibernate字段中设置默认值?
答案 0 :(得分:160)
如果您想要真正的数据库默认值,请使用columnDefinition
:
@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
请注意columnDefinition
中的字符串与数据库有关。此外,如果您选择此选项,则必须使用dynamic-insert
,因此Hibernate
不会在插入时包含null
值的列。否则谈论违约是无关紧要的。
但是如果您不想要数据库默认值,而只是Java代码中的默认值,那么只需初始化您的变量 - private Integer myColumn = 100;
答案 1 :(得分:28)
如何为字段设置默认值呢?
private String _foo = "default";
//property here
public String Foo
如果他们传递一个值,那么它将被覆盖,否则,你有一个默认值。
答案 2 :(得分:24)
您可以使用@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;
}
此方法不依赖于Hibernate下的数据库类型/版本。在持久化映射对象之前设置默认值。
答案 3 :(得分:17)
使用hibernate注释
@ColumnDefault("-1")
private Long clientId;
答案 4 :(得分:7)
如果你想在数据库中这样做:
在数据库中设置默认值(sql server sample):
ALTER 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" />
...
请参阅,键是insert =“false”update =“false”
答案 5 :(得分:6)
上面提供的解决方案是使用Hibernate设置默认值
@Column(name = “myColumn”, nullable = false, columnDefinition = “int default 100")
是特定于供应商的,不适用于Oracle。
答案 6 :(得分:5)
一个解决方案是让你的getter检查你正在使用的值是否为null(或者它的非初始化状态是什么),如果它等于那个,只需返回你的默认值:
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
答案 7 :(得分:4)
我搜索了这个并找到了许多对列的默认值的答案。如果你想使用SQL表中定义的默认值,那么在@Column Annotation中使用 &#34; insertable = false&#34; 即可。可插入
@Column(name = columnName,length = lengthOfColumn,insertable = false)
如果您正在使用columnDefination,那么@Column注释可能会因为它依赖于数据库而无法工作。
答案 8 :(得分:4)
如果要设置默认实体属性值,则可以使用默认值初始化实体字段。
例如,您可以将默认的createdOn
实体属性设置为当前时间,例如:
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
如果不建议使用JPA和Hibernate生成DDL模式,则可以使用JPA columnDefinition
批注的@Column
属性,如下所示:
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
需要@Generated
批注,因为我们要指示Hibernate在刷新持久性上下文后重新加载实体,否则,数据库生成的值将不会与内存中实体状态同步。
最好使用Flyway之类的工具并使用DDL增量迁移脚本,而不是使用columnDefinition
。这样,您将在脚本而不是JPA批注中设置DEFAULT
SQL子句。
有关使用
@Generated
批注的更多详细信息,请查看this article。
如果您将JPA与Hibernate一起使用,则还可以使用@ColumnDefault
批注,如下所示:
@Column(name = "created_on")
@ColumnDefault(value="CURRENT_TIMESTAMP")
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
如果您将JPA与Hibernate一起使用,并希望设置创建时间戳记,则可以使用@ColumnDefault
批注,如下所示:
@Column(name = "created_on")
@CreationTimestamp
private LocalDateTime createdOn;
有关使用
@CreationTimestamp
批注的更多详细信息,请查看this article。
答案 9 :(得分:4)
使用@ColumnDefault()
注释。这只是休眠。
答案 10 :(得分:3)
使用表的任何列中的默认值。那么您必须将@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;
}
答案 11 :(得分: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
...
}
答案 12 :(得分:1)
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
答案 13 :(得分:0)
假设我们有一个包含子实体的实体。
在实体上使用insertable = false, updatable = false
可防止实体创建新的子实体并在默认DBMS值之前。但这有一个问题,就是我们必须始终使用默认值,或者如果我们需要该实体包含非默认的另一个子实体,则必须尝试在运行时将这些注释更改为insertable = true, updatable = true
,所以这似乎不是一条好路。
如果在子实体insertable = false, updatable = false
中使用更有意义,则无论我们使用哪种方法,都不会再创建子实体(对于@DynamicInsert
,不会
可以通过多种方式来插入默认值,例如使用构造函数或设置器来默认实体属性值。像将JPA与columnDefinition一起使用之类的其他方式的缺点在于,它们默认情况下会插入一个null,并且DBMS的默认值不在此位置。
但是使用@DynamicInsert
可以避免在要插入具有默认值的子实体时向数据库发送null的情况,进而允许插入具有默认值以外的值的子实体。
对于插入,该实体是否应该使用动态sql生成,而在准备好的sql语句中仅引用非null列?
鉴于以下需求:
DBMS :PostgreSQL | 语言:科特林
@Entity
@Table(name = "entity")
@DynamicInsert
data class EntityTest(
@Id @GeneratedValue @Column(name = "entity_uuid") val entityUUID: UUID? = null,
@OneToOne(cascade = [CascadeType.ALL])
@JoinColumn(name = "subentity_uuid", referencedColumnName = "subentity_uuid")
var subentityTest: SubentityTest? = null
) {}
@Entity
@Table(name = "subentity")
data class SubentityTest(
@Id @GeneratedValue @Column(name = "subentity_uuid", insertable = false, updatable = false) var subentityUUID: UUID? = null,
@Column(insertable = false, updatable = false) var name: String,
) {
constructor() : this(name = "")
}
该值是默认在数据库中设置的:
alter table entity alter column subentity_uuid set default 'd87ee95b-06f1-52ab-83ed-5d882ae400e6'::uuid;
GL
答案 14 :(得分:0)
我正在使用hibernate 5和postgres,而这在我看来是有效的。
@Column(name =“ ACCOUNT_TYPE”, 可空 = false,columnDefinition =“ varchar2默认为'END_USER'”) @Enumerated(EnumType.STRING) 私人AccountType accountType;
答案 15 :(得分:0)
如果要根据数据库设置默认值,只需设置@Column( columnDefinition = "int default 1")
但是,如果你打算在你的java应用程序中设置默认值,你可以在你的类属性上设置它,如下所示:private Integer attribute = 1;
答案 16 :(得分:0)
使用Oracle时,我试图为Enum插入默认值
我发现以下内容效果最佳。
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
答案 17 :(得分:-3)
上述建议有效,但前提是在getter方法上使用了注释。如果在声明成员的地方使用注释,则不会发生任何事情。
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}