休眠注释,指定列默认值

时间:2010-08-05 09:44:26

标签: java oracle hibernate orm jpa

我有一个域对象,注释如下

 @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列)的值。

7 个答案:

答案 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