2010-08-05 2 views
2

У меня есть объект домена и аннотированный следующимHibernation аннотации, задать значение по умолчанию столбца

@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.? В настоящее время он выдает ошибку, когда поле равно NULL, что очень очевидно, поскольку оно не может быть нулевым в соответствии с ограничениями БД. Как мне это сделать? Один из вариантов - отметить это поле как переходное, а вставки работают нормально. Но отрицательный аспект заключается в том, что я не смогу получить значение (столбца request_date).

ответ

7

Это недостающая особенность в аннотациях спящего режима. Также существует некоторое обходное решение, которое опубликовал Йок. Проблема заключается в том, что обходной путь зависит от поставщика и может не работать для всех БД. В моем случае, Oracle, он не работает и был зарегистрирован как ошибка.

3

Присвоить значение по умолчанию в поле:

private Date requestDate = new Date(); 
+2

Это веб-приложение. Вышеприведенная строка введет время сервера, которое будет отличаться от sysdate (при условии, что сервер приложений и db находятся в разностных часах). Также тот же код будет работать на разных серверах разработки, но все они указывают на тот же экземпляр db. – chedine

+0

@chedine: Если у вас есть определенные ограничения, почему бы вам не добавить их в вопрос ?! Вы бы лучше ответили, и люди не теряли бы времени, предлагая что-то, что не соответствует вашим ограничениям. –

+0

Может быть, моя ошибка. В любом случае, спасибо за ваше время. – chedine

8

Вы можете поставить значение по умолчанию в ColumnDefinition. Пример может выглядеть следующим образом:

@Column(name = "REQUEST_DATE", nullable = false, columnDefinition = "date default sysdate") 
+0

Я уже пробовал. @Column (name = "REQUEST_DATE", columnDefinition = "DATE ​​DEFAULT sysdate NOT NULL"). Это не работает. – chedine

+0

@chedine: Пожалуйста, укажите в своем вопросе, что вы уже пробовали, и почему он не работает для вас. См. Мой другой комментарий для объяснения этого. –

+0

@chedine: Какую ошибку он бросает? когда вы используете решение, подобное моему. Coz Я использую это и не сталкиваюсь с какой-либо проблемой. – YoK

0

Сделать по умолчанию в Oracle для SYSDATE колонок:

ALTER TABLE APP MODIFY (REQUEST_DATE DEFAULT SYSDATE);

Тогда, с точки зрения в Hibernate может быть обнуляемыми.

Hibernate сохранит NULL в базе данных. Oracle преобразует это в SYSDATE. И все будут счастливы.

+0

Так оно и есть. Но я получаю исключение, когда пытаюсь вставить объект с requestdate = null. Причина: java.sql.BatchUpdateException: ORA-01400: не может вставить NULL в («DBINST». «APP». «REQUEST_DATE») – chedine

+0

Если вы запустили тот же INSERT из SQL * Plus или что-то еще, это работает или дает вам эта ошибка? –

+0

Такая же ошибка «Невозможно вставить нуль». – chedine

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; 
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 Generate:

Alter Table YOUR_TABLE add TEMP_COLUMN varchar2(255) default '@' not null; 
Смежные вопросы