如何在Hibernate中设置默认值

时间:2010-06-24 13:18:34

标签: java hibernate

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

18 个答案:

答案 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的默认列值

如果不建议使用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的默认值不在此位置。


使用DBMS插入默认值,使用Hibernate插入可选值

但是使用@DynamicInsert可以避免在要插入具有默认值的子实体时向数据库发送null的情况,进而允许插入具有默认值以外的值的子实体。

对于插入,该实体是否应该使用动态sql生成,而在准备好的sql语句中仅引用非null列?

鉴于以下需求:

  • 该实体不负责创建新的子实体。
  • 插入实体时,子实体是在DBMS中定义为默认实体的子实体。
  • 可以创建一个实体,该实体的子实体的UUID不同于默认实体。

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;
}