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

178

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


3
你是使用XML配置文件还是注解? - Bruno
2
下面的答案只提供了JPA解决方案,这是正确的,但是如果要使用Hibernate解决方案,请参见https://dev59.com/vV4c5IYBdhLWcg3wSIgs,您必须使用`@ColumnDefault`。 - pdem
18个回答

3
要使用表中任何列的默认值,则必须将@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;

}

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

我试过了,当我这样做时

@Column(name = "is_sale", columnDefinition = "default false")
private boolean isSale = false;

在此输入图片描述

他没有添加。而当我添加时

@Column(name = "is_sale", columnDefinition = "bool default false")
 private boolean isSale = false;

在这种情况下,Hibernate生成了这样的SQL。
alter table if exists customer_product add column is_sale bool default false

这里输入图片描述 这对我很有帮助。


1
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>

6
可以解释一下你的解决方案吗?你可能想要阅读《如何撰写一个好的回答》。 - Markus W Mahlberg

1
我正在使用Hibernate 5和Postgres进行工作,这对我起了作用。
@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;

0

我们可以使用带有 @Column 注释的 getter。

所有的 @Column 应该只在 getter 中进行注释,而不是直接变量声明。通过这种方式,我们可以解决它。

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

0
如果您想在数据库中设置默认值,只需设置@Column(columnDefinition = "int default 1")
但是,如果您想在Java应用程序中设置默认值,可以像这样设置类属性:private Integer attribute = 1;

0
假设我们有一个包含子实体的实体。
在实体上使用insertable = false, updatable = false可以防止实体创建新的子实体并覆盖默认的DBMS值。但是这样做的问题是,我们必须始终使用默认值,或者如果我们需要实体包含另一个不是默认值的子实体,则必须尝试在运行时更改这些注释为insertable = true, updatable = true,因此这似乎不是一条好路线。
在子实体内部,如果在所有列中使用insertable = false, updatable = false更有意义,这样无论我们使用哪种方法(使用@DynamicInsert将不需要),都不会创建更多的子实体。
插入默认值可以通过各种方式完成,例如使用构造函数或setter使用默认实体属性值。其他方法,如使用具有columnDefinition的JPA,缺点是它们默认插入null,并且DBMS的默认值不会优先。

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

但是使用@DynamicInsert当我们想要插入一个具有默认值的子实体时,可以避免将null发送到数据库,并且反过来,我们允许插入具有非默认值的子实体。

对于插入操作,此实体应使用动态SQL生成,其中只有非null列在准备好的SQL语句中被引用吗?

给定以下需求:

  • 该实体不负责创建新的子实体。
  • 插入实体时,子实体是在DBMS中定义的默认实体。
  • 可以创建具有与默认值不同的UUID的实体及其对应的子实体。

DBMS: PostgreSQL | 语言: Kotlin

@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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接