O UserType personalizado do Hibernate não está funcionando

Eu criei um UserType (veja abaixo) para lidar com uma situação em nosso banco de dados mySQL onde estamos salvando datas nulas como 0000-00-00 00:00:00.

Quando tento persistir minha entidade com um nulo para dispDT (veja abaixo), ele gera essa exceção: "javax.persistence.PersistenceException: org.hibernate.PropertyValueException: a propriedade não-nula faz referência a um valor nulo ou transitório: myEntity.dispDt"

Ao definir um ponto de interrupção em cada método no MySQLTimeStampUserType, posso ver que ele chama o método deepCopy e nunca chama o método nullSafeSet. Eu pensei que o objetivo do método nuyllSafeSet era permitir que eu manipulasse o valor antes de persistir nele. O que estou fazendo de errado?

Anotações de entidade

@Basic(optional = false)
@Column(name = "disp_dt")
@Type(type = "mypackage.MySQLTimeStampUserType")
//    @Temporal(TemporalType.TIMESTAMP)
private Date dispDt;

Classe de tipo de usuário

public class MySQLTimeStampUserType implements UserType {

private static final int[] SQL_TYPES = {Types.TIMESTAMP};

public int[] sqlTypes() {
    return SQL_TYPES;
}

public Class returnedClass() {
    return Date.class;
}

public boolean equals(Object x, Object y) throws HibernateException {
    if (x == y) {
        return true;
    } else if (x == null || y == null) {
        return false;
    } else {
        return x.equals(y);
    }

}

public int hashCode(Object arg0) throws HibernateException {
    throw new UnsupportedOperationException("Not supported yet.");
}

public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) throws HibernateException, SQLException {
    // if the date is 0000-00-00 00:00:00 return null, else return the timestamp
    Date result = null;
    if (!resultSet.wasNull()) {
        if (!resultSet.getString(names[0]).equals("0000-00-00 00:00:00")) {
            result = resultSet.getDate(names[0]);
        }
    }
    return result;
}

public void nullSafeSet(PreparedStatement statement, Object value, int index) throws HibernateException, SQLException {
    // if the date is null set the value to "0000-00-00 00:00:00" else save the timestamp
    if (value == null) {
        statement.setString(index, "0000-00-00 00:00:00");
    } else {
        statement.setTimestamp(index,(Timestamp) value);
    }

}

public Object deepCopy(Object value) throws HibernateException {
    return value;
}

public boolean isMutable() {
    return false;
}

public Serializable disassemble(Object value) throws HibernateException {
    throw new UnsupportedOperationException("Not supported yet.");
}

public Object assemble(Serializable cached, Object owner) throws HibernateException {
    throw new UnsupportedOperationException("Not supported yet.");
}

public Object replace(Object original, Object target, Object owner) throws HibernateException {
    return original;
}
}

questionAnswers(3)

yourAnswerToTheQuestion