[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-3822) mysql lack of timestamps with milliseconds breaks hibernate when used with versioning

Thomas Hartwig (JIRA) noreply at atlassian.com
Sat Mar 21 14:19:38 EDT 2009


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3822?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=32691#action_32691 ] 

Thomas Hartwig commented on HHH-3822:
-------------------------------------

Below you find a little sample interceptor to circumstance this problem. Persistentable is a superclass of all of our entities which contains a mtime column for versioning. This can probably made more generic via hibernate meta informations.

public class MysqlFixInterceptor extends EmptyInterceptor {
   @Override
   public void postFlush(Iterator entities) {
      while (entities.hasNext()) {
         Object entity = entities.next();
         if(entity instanceof Persistentable && ((Persistentable) entity).getMtime() != null) {
            ((Persistentable) entity).setMtime(new Date((((Persistentable) entity).getMtime().getTime() / 1000) * 1000));
         }
      }
   }
}


> mysql lack of timestamps with milliseconds breaks hibernate when used with versioning
> -------------------------------------------------------------------------------------
>
>                 Key: HHH-3822
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3822
>             Project: Hibernate Core
>          Issue Type: Improvement
>          Components: core
>    Affects Versions: 3.3.1
>         Environment: mysql-5.1.32-1.fc10
> Java(TM) SE Runtime Environment (build 1.6.0_12-b04)
>            Reporter: Thomas Hartwig
>
> When I persist an instance with saveOrUpdate into a mysql dbms a version field is kept in milliseconds precision in the current application context. Unfortunately mysql truncates all the milliseconds from this field. So a following merge or any other version based operation fails until the object is refetched.
> Possible workarounds:
> - use an interceptor for truncating the version field
> - avoid using timestamp of mysql
> I know the milliseconds problem is really annoying by mysql and it is not a hibernate fault, but probably it can be avoided somehow or hibernate should throw an unsupported exception.
> Below is the sample setup:
> @Entity
> @Table(cname = "_Column")
> public class MappedColumn implements Serializable {
>    private Date mtime;
>    @Version
>    public Date getMtime() {
>       return mtime;
>    }
>    public void setMtime(Date mtime) {
>       this.mtime = mtime;
>    }
>    [...]
> }
> CREATE TABLE `_Column` (
>   `name` varchar(255) collate latin1_german1_ci NOT NULL,
>   `booleanColumn` bit(1) NOT NULL default '\0',
>   `id` varchar(255) collate latin1_german1_ci NOT NULL default '',
>   `ctime` datetime default NULL,
>   `mtime` datetime default NULL,
>   `columnOsc` varchar(255) collate latin1_german1_ci default NULL,
>   `columnDbr` int(11) default NULL,
>   PRIMARY KEY  (`id`),
>   UNIQUE KEY `name` (`name`)
> ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the hibernate-issues mailing list