我有一个域对象,注释如下
@Entity
@Table(name = "REQUEST")
public class Request {
/**
* Unique id for this request
*/
@Id
@GeneratedValue
@Column(name = "EQ_ID")
private long requestId;
/**
*
*/
@Column(name = "EMAIL_ID")
private String emailId;
/**
*
*/
@Column(name = "REQUEST_DATE")
private Date requestDate;
/**
*Getters/setters omitted
*/
}
列 Request_date 不能为空,根据DDL,默认值为sysdate(oracle DB)。如何对该字段进行注释,以便在requestDate属性为null时,hiberanate会自动插入sysdate。目前,当字段为空时,它会抛出错误,这非常明显,因为根据数据库约束它不能为空。我该怎么做? 另一种方法是将此字段标记为瞬态,插入工作正常。但负面的方面是,我将无法检索(request_date列)的值。
答案 0 :(得分:8)
您可以将默认值放在columnDefinition中。一个例子如下:
@Column(name = "REQUEST_DATE", nullable = false, columnDefinition = "date default sysdate")
答案 1 :(得分:7)
这是hibernate注释中缺少的功能。 Yok也发布了一些解决方法。问题是变通方法依赖于供应商,可能不适用于所有数据库。在我的情况下,Oracle,它没有工作,并被报告为一个错误。
答案 2 :(得分:3)
为字段指定默认值:
private Date requestDate = new Date();
答案 3 :(得分:1)
使用@ColumnDefault(用于DDL更新)。 hibernate.hbm2ddl.auto =更新
import org.hibernate.annotations.ColumnDefault;
....
@ColumnDefault(value="'@'")
@Column(name = "TEMP_COLUMN", nullable = false)
public String getTempColumn() {
return tempColumn;
}
DDL生成:
Alter Table YOUR_TABLE add TEMP_COLUMN varchar2(255) default '@' not null;
答案 4 :(得分:0)
在Oracle中为列SYSDATE:
创建默认值 ALTER TABLE APP MODIFY (REQUEST_DATE DEFAULT SYSDATE);
然后,从Hibernate的角度来看,它可以是可以为空的。
Hibernate会将NULL保存到数据库中。 Oracle会将其转换为SYSDATE。每个人都会很开心。
答案 5 :(得分:0)
我解决了为变量赋值这样的 private Integer active = 0;
@Entity
@Table(name="products")
public class ServiziTipologia {
@Id
@GeneratedValue
private Integer id;
private String product;
private String description;
private Integer active= 0;
答案 6 :(得分:0)
如果您用@DynamicInsert
标记您的实体,例如
@Entity
@DynamicInsert
@Table(name = "TABLE_NAME")
public class ClassName implements Serializable {
Hibernate将生成不包含null
值的SQL。然后数据库将插入其自己的默认值。这确实会对性能产生影响,请参见Dynamic Insert。