Как мне привязать метку времени гибернации к MySQL BIGINT? - PullRequest
1 голос
/ 15 декабря 2008

Я использую Hibernate 3.x, MySQL 4.1.20 с Java 1.6. Я сопоставляю метку времени Hibernate с таймстампом MySQL. Все идет нормально. Проблема в том, что MySQL хранит TIMESTAMP в секундах и отбрасывает миллисекунды, и теперь мне нужна точность в миллисекундах. Я полагаю, что я могу использовать BIGINT вместо TIMESTAMP в моей таблице и конвертировать типы в моем коде Java. Я пытаюсь выяснить, есть ли лучший способ сделать это, используя hibernate, mysql, JDBC или какую-либо комбинацию, чтобы я все еще мог использовать функции даты в моих запросах HSQL и / или SQL?

Ответы [ 4 ]

3 голосов
/ 16 декабря 2008

Также обратите внимание на создание пользовательской реализации Hibernate Type. Что-то вроде (psuedocode, поскольку у меня нет удобной среды, чтобы сделать его пуленепробиваемым):

public class CalendarBigIntType extends org.hibernate.type.CalendarType {
    public Object get(ResultSet rs, String name) {
        return cal = new GregorianCalendar(rs.getLong(name));
    }
    public void set(PreparedStatement stmt, Object value, int index) {
        stmt.setParameter(index, ((Calendar) value).getTime());
    }
}

Затем вам нужно отобразить новый объект, используя спящий режим TypeDef и Type mappings. Если вы используете аннотации Hibernate, это будет выглядеть следующим образом:

@TypeDef (name="bigIntCalendar", typeClass=CalendarBigIntType.class)
@Entity
public class MyEntity {
    @Type(type="bigIntCalendar")
    private Calendar myDate;
}
1 голос
/ 24 марта 2014

Для тех, кто все еще интересуется этой проблемой: MySQL 5.6.4 поддерживает временные метки с точностью. Создание подкласса MySQL5Dialect для переопределения используемого типа MySQL решает проблему.

0 голосов
/ 12 августа 2010

Я изменил свой тип данных с временной отметки на десятичную (17,3) и написал несколько вспомогательных методов

public static Calendar bigDec2Cal(BigDecimal tsp) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(tsp.longValue());
    return cal;
}

public static Date bigDec2Date(BigDecimal tsp) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(tsp.longValue());
    return cal.getTime();
}

public static BigDecimal cal2BigDec(Calendar cal) {
    BigDecimal tsp = new BigDecimal(cal.getTimeInMillis());
    return tsp;
}

public static BigDecimal date2BigDec(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    BigDecimal tsp = new BigDecimal(cal.getTimeInMillis());
    return tsp;
}
0 голосов
/ 15 декабря 2008

Почему бы не использовать его в дополнение к полю TIMESTAMP? У вас будет одно поле (которое уже определено) для хранения даты без миллисекунд, и другое поле для миллисекунд. Вы по-прежнему можете запускать свои запросы HSQL в первом поле, за исключением того, что вам необходимо убедиться, что вы позаботились о правильном сохранении миллисекунды (путем анализа вашего объекта Java Date перед сохранением его с помощью Hibernate).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...