Versioned HQL update might issue incorrect SQL

Description

When executing a versioned HQL update, the version column (java.util.Calendar) is updated using 'updated=updated+1'. Some MySQL versions will throw an exception whenever the incremented value ended with 59. For instance, if the previous version value was '2010-03-12 13:00:59', then MySQL will throw an exception as the incremented value would be '2010-03-12 13:00:60' (see http://dev.mysql.com/doc/refman/5.0/en/time-zone-leap-seconds.html for more on this).

In this case, Hibernate would throw the exception 'SEVERE: Data truncation: Incorrect datetime value: '20100302130060.000000' for column 'updated' at row 1'.

I've received feedback on this issue through the Hibernate forum which indicates that this might be a bug (https://forum.hibernate.org/viewtopic.php?f=1&t=1006238)

  •  

    • Entity.hbm.xml **

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.tracker.robot.db.entities.Entity" table="track">
<id column="id" length="36" name="id" type="java.lang.String" />
<version column="updated" name="updated" type="java.util.Calendar" unsaved-value="null" />
<property column="title" length="255" name="title" type="java.lang.String"/>

</class>
</hibernate-mapping>

  •  

    • Entity.java **

import java.util.Calendar;

public class Entity {

private String id;
private String title;
private Calendar updated;

public Entity() {

}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public Calendar getUpdated() {
return updated;
}

public void setUpdated(Calendar updated) {
this.updated = updated;
}
}

  •  

    • TestCode **

currentSession.beginTransaction();
Query q = currentSession.createQuery("update versioned Entity e set e.title = :title where e.id = :id");
q.setString("title", "TEST");
q.setString("id", "000059e4-8b71-41c1-81f2-5cacabba5554");
q.executeUpdate();
currentSession.getTransaction().rollback();

Environment

Hibernate 3.5.4 and MySQL.

Fixed

Assignee

Steve Ebersole

Reporter

Upright Music ApS

Fix versions

Labels

None

backPortable

None

Suitable for new contributors

None

Requires Release Note

None

Pull Request

None

backportDecision

None

Affects versions

Priority

Minor