[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