-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 posts ] 
Author Message
 Post subject: Hibernate annotations et Timestamp automatique
PostPosted: Thu Sep 09, 2010 10:20 am 
Newbie

Joined: Thu Sep 09, 2010 9:57 am
Posts: 5
Bonjour,

J'ai un bean avec une date :
Code:
      private Date storageTimestampOrNull;


Avec un mapping par XML, ce champ est automatiquement renseigné lors de l'insertion en base :
Code:
      <timestamp name="storageTimestampOrNull" column="StorageTimestamp" source="db" />


Je souhaite passer aux Annotations. Aucun problème pour tous les champs, y compris les @MappedSuperclass et @Embeddable, mais impossible d'avoir cet attribut storageTimestampOrNull renseigné lors de l'insertion. Voici mes annotations pour ce champ :
Code:
   @Temporal(TemporalType.TIMESTAMP)
   @Column(name = "storage_timestamp", insertable = false, updatable = false)
   @Type(type = "mon.package.UtcTimestampUserType")
   @Generated(GenerationTime.ALWAYS)
   private Date storageTimestampOrNull;

UtcTimestampUserType est un UserType pour forcer un stockage UTC
J'ai fait plein de recherches, pleins d'essais comme :
Code:
@Column(columnDefinition = "timestamp default current_timestamp on update current_timestamp", ...)

ou encore
Code:
@Column(nullable = false, ...)

mais rien à faire, storageTimestampOrNull est toujours null !

A noter également, pour l'instant, uniquement des tests unitaires avec HSQLDB, la cible étant PostgrSQL.

Côté versions, j'utilise :
  • org.hibernate:hibernate:3.2.7.ga
  • org.hibernate:hibernate-annotations:3.2.1.ga
  • hsqldb:hsqldb:1.8.0.10
mais je peux changer ...

Des idées ?

Merci

Xavier


Top
 Profile  
 
 Post subject: Re: Hibernate annotations et Timestamp automatique
PostPosted: Tue Sep 14, 2010 4:06 am 
Newbie

Joined: Thu Dec 18, 2003 4:13 am
Posts: 19
Bonjour Xavier,

Ce ne serait pas les attributs insertable et updatable à false qui empêchent les écritures ?
Code:
@Column(name = "storage_timestamp", insertable = false, updatable = false)



Cf la doc (http://docs.jboss.org/hibernate/stable/ ... ml_single/) chap 2.2.2.3:
    insertable (optional): whether or not the column will be part of the insert statement (default true)
    updatable (optional): whether or not the column will be part of the update statement (default true)

/Xavier


Top
 Profile  
 
 Post subject: Re: Hibernate annotations et Timestamp automatique
PostPosted: Tue Sep 14, 2010 4:18 am 
Newbie

Joined: Thu Sep 09, 2010 9:57 am
Posts: 5
Salut Xavier

xcoulon wrote:
Ce ne serait pas les attributs insertable et updatable à false qui empêchent les écritures ?
Code:
@Column(name = "storage_timestamp", insertable = false, updatable = false)



Je ne pense pas, du moins, moi, j'ai compris que ces réglages permettent d'indiquer que ce champ n'aura pas de données lors des requêtes insert ou update, ce qui est le cas ! En tout cas, j'ai trouvé ces infos pour l'utilisation de @Generated.

Je crois d'ailleurs que j'avais commencé sans ces infos (plus sûr à 100% .... faudrait que je refasse des essais) et c'était pareil ... :-(

En tout cas, merci pour ta réponse,

Xavier


Top
 Profile  
 
 Post subject: Re: Hibernate annotations et Timestamp automatique
PostPosted: Tue Sep 14, 2010 4:25 am 
Newbie

Joined: Thu Dec 18, 2003 4:13 am
Posts: 19
Est-ce que tu as un petit test Junit qui reproduit le problème ?

/Xavier


Top
 Profile  
 
 Post subject: Re: Hibernate annotations et Timestamp automatique
PostPosted: Tue Sep 14, 2010 4:33 am 
Expert
Expert

Joined: Tue Dec 28, 2004 7:02 am
Posts: 573
Location: Toulouse, France
Je n'ai pas pratiqué ce genre de chose avec HSQLDB, mais en y réfléchissant, ça doit être une sorte de trigger qui gère ça (et je me demande si HSQLDB en gère, d'ailleurs).
Comme la javadoc l'indique (http://www.163jsp.com/help/javaee50api/ ... efinition()), c'est le fragment SQL utilisé pour généner le DDL.

Je suppose que tu attaques donc une base que tu crées avec hbm2ddl? Est-ce que tu as bien vérifié dans les logs que ce que tu as écrit dans @Column apparaît au moment de la création du schéma ? Et notamment qu'il n'y a pas d'erreur ?

Baptiste


Top
 Profile  
 
 Post subject: Re: Hibernate annotations et Timestamp automatique
PostPosted: Tue Sep 14, 2010 6:09 am 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
Je ne pense pas que Hibernate Annotations supporte ça nativement encore. Mais c'est facile a faire. Il faut en gros utiliser le type dbtimestamp au lieu du type timestamp.
Deux solutions:
1. tu utilises @Type a la porc et tu regardes si ca fonctionne.
2. tu ouvres un JIRA, propose une annotation pour l'extension @Source(VM), et propose le patch

Note que ton mapping annotations doit porter @Version.

_________________
Emmanuel


Top
 Profile  
 
 Post subject: Re: Hibernate annotations et Timestamp automatique
PostPosted: Tue Sep 14, 2010 11:23 am 
Newbie

Joined: Thu Sep 09, 2010 9:57 am
Posts: 5
Bonjour à tous,

Merci pour vos réponses !

xcoulon wrote:
Est-ce que tu as un petit test Junit qui reproduit le problème ?

J'essaie de voir si je peux extraire ça ...

batmat wrote:
Je n'ai pas pratiqué ce genre de chose avec HSQLDB, mais en y réfléchissant, ça doit être une sorte de trigger qui gère ça (et je me demande si HSQLDB en gère, d'ailleurs).

Comme je le disais au début, ça marche en mapping XML avec source="db" :
Code:
<timestamp name="storageTimestampOrNull" column="StorageTimestamp" source="db" />


batmat wrote:
Est-ce que tu as bien vérifié dans les logs que ce que tu as écrit dans @Column apparaît au moment de la création du schéma ? Et notamment qu'il n'y a pas d'erreur ?

J'ai activé hibernate.show_sql=true et org.hibernate.tool.hbm2ddl=debug, j'ai les traces suivantes mais je ne vois pas les requêtes de création (mais je vois la table créée dans la base), je ne sais pas pourquoi :
Code:
14 sept. 2010 16:06:12 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata
INFO: table not found: t_xxx
14 sept. 2010 16:06:12 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: schema update complete

Par contre, dans la table créée (PostgreSQL), le champ n'a rien de particulier (pour la génération automatique ) :
Code:
storage_timestamp timestamp without time zone NOT NULL,

mais avant chaque insert, je vois cette requête qui permet à Hibernate de renseigner le champ pour l'insertion :
Code:
Hibernate: select now()
Hibernate: insert into ...

batmat wrote:
Comme la javadoc l'indique (http://www.163jsp.com/help/javaee50api/ ... efinition()), c'est le fragment SQL utilisé pour généner le DDL.

Ca y est, ça marche avec les annotations, et j'ai compris pourquoi j'avais suivi la piste de columnDefinition, sauf que ce que j'avais mis ne "passait" pas (erreur). Je viens de mettre ça :
Code:
@Column(columnDefinition = "timestamp default current_timestamp", insertable = false, updatable = false, nullable = false)

et ça marche. Le champ créé dans PostgreSQL a cette définition :
Code:
storage_timestamp timestamp without time zone NOT NULL DEFAULT now(),

En fait, cette solution consiste à préciser les caractéristiques du champ (c'est bien le but de columnDefinition ) en demandant une valeur par défaut à current_timestamp transformé en now() dans PostgreSQL. D'ailleurs, c'est marrant, au niveau des requêtes, maintenant, j'ai ça :
Code:
Hibernate: insert into t_...
Hibernate: select hibernatep_.storage_timestamp as ...

Par contre, je ne sais pas si @Temporal est nécessaire :
Code:
@Temporal(TemporalType.TIMESTAMP)

emmanuel wrote:
Je ne pense pas que Hibernate Annotations supporte ça nativement encore.

OK, je comprends mieux ! merci

Xavier


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.