Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Hibernate设置默认实体属性值_Java_Hibernate_Orm_Entity_Default Value - Fatal编程技术网

Java 如何使用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")

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

如何设置字段的默认值

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,从而允许插入具有非默认值的子实体

对于插入,此实体是否应使用动态