2010-08-05 8 views
2

J'ai un objet de domaine et annotés comme suitannotations Hibernation, indiquez la valeur par défaut de la colonne

@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 
*/ 
} 

La colonne REQUEST_DATE ne peut pas être nulle et selon la LDD la valeur par défaut est sysdate (oracle DB). Comment puis-je annoter ce champ de sorte que si la propriété requestDate est null, hiberanate insère automatiquement sysdate. Actuellement, il lance une erreur lorsque le champ est nul, ce qui est très évident car il ne peut pas être nul selon les contraintes de la base de données. Comment je vais à ce sujet? Une alternative est de marquer ce champ comme transitoire et les inserts fonctionnent bien. Mais l'aspect négatif est que, je ne serai pas en mesure de récupérer la valeur (de la colonne request_date).

Répondre

7

Il s'agit d'une fonctionnalité manquante dans les annotations d'hibernation. Il existe également une solution de contournement que Yok a publié. Le problème est que la solution de contournement dépend du fournisseur et peut ne pas fonctionner pour toutes les bases de données. Dans mon cas, Oracle, cela ne fonctionne pas et a été signalé comme un bug.

3

attribuer une valeur par défaut au champ:

private Date requestDate = new Date(); 
+2

Ceci est une application Web. La ligne ci-dessus va insérer l'heure du serveur qui sera différente de sysdate (en supposant que le serveur d'applications et la base de données sont dans les fuseaux horaires diff). De même, le même code sera exécuté sur différents serveurs de développement, mais tous pointent vers la même instance db. – chedine

+0

@chedine: Si vous avez des contraintes spécifiques, pourquoi ne pas les ajouter à la question ?! Vous feriez mieux de répondre et les gens ne perdraient pas leur temps à suggérer quelque chose qui ne correspondrait pas à vos contraintes ... –

+0

Peut-être, mon erreur. Quoi qu'il en soit, merci pour votre temps. – chedine

8

Vous pouvez mettre la valeur par défaut dans un columnDefinition. Un exemple ressemblerait à ceci:

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

je l'ai déjà essayé. @Column (name = "REQUEST_DATE", columnDefinition = "DATE ​​DEFAULT sysdate NOT NULL"). Ça ne marche pas. – chedine

+0

@chedine: S'il vous plaît mentionner dans votre question ce que vous avez déjà essayé et pourquoi cela ne fonctionne pas pour vous. Voir mon autre commentaire pour la justification derrière ceci. –

+0

@chedine: Quelle erreur lance-t-elle? lorsque vous utilisez une solution similaire à la mienne. Parce que je l'utilise et je n'ai aucun problème. – YoK

0

Faire défaut dans Oracle pour la SYSDATE colonne:

ALTER TABLE APP MODIFY (REQUEST_DATE DEFAULT SYSDATE);

Ensuite, du point de vue de mise en veille prolongée, il peut être annulable. Hibernate enregistrera une valeur NULL dans la base de données. Oracle va convertir cela en SYSDATE. Et tout le monde sera heureux.

+0

Voilà comment c'est maintenant. Mais je reçois une exception quand j'essaie d'insérer un objet avec requestdate = null. Causé par: java.sql.BatchUpdateException: ORA-01400: impossible d'insérer NULL dans ("DBINST". "APP". "REQUEST_DATE") – chedine

+0

Si vous exécutez le même INSERT à partir de SQL * Plus ou quelque chose, cela fonctionne-t-il ou vous donne-t-il cette erreur? –

+0

Même erreur "Impossible d'insérer une valeur nulle". – chedine

0

J'ai résolu l'attribution d'une valeur à la variable comme ceci 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

L'utilisation @ColumnDefault (travail pour la mise à jour DDL). hibernate.hbm2ddl.auto = mise à jour

import org.hibernate.annotations.ColumnDefault; 

.... 

@ColumnDefault(value="'@'") 
@Column(name = "TEMP_COLUMN", nullable = false) 
public String getTempColumn() { 
    return tempColumn; 
} 

Générer DDL:

Alter Table YOUR_TABLE add TEMP_COLUMN varchar2(255) default '@' not null; 
Questions connexes