Как настроить Hibernate6 по умолчанию для отметки времени с точностью до наносекунды?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как настроить Hibernate6 по умолчанию для отметки времени с точностью до наносекунды?

Сообщение Anonymous »

Я хочу, чтобы Hibernate сохранял свойства LocalDateTime в базе данных H2 с точностью, содержащей наносекунды (

Код: Выделить всё

Timestamp(9)
) по умолчанию.
"По умолчанию" означает прикрепление @Column(columnDefinition = "TIMESTAMP(9)") к каждому свойству LocalDateTime не может быть решением.
В Hibernate5 решение заключалось в создании собственного диалекта и вызове RegisterColumnType(Types.TIMESTAMP, "timestamp(9)") в его конструктор.
Однако я не нашел решения для Hibernate6. Я попытался создать собственный диалект и переопределитьsolveSqlTypeLength.

Код: Выделить всё

public class CustomH2Dialect extends H2Dialect {

/* The Hibernate 5 Solution was to call registerColumnType(Types.TIMESTAMP, "timestamp(9)"); in the ctor.*/
@Override
public int resolveSqlTypeLength(String columnTypeName, int jdbcTypeCode, int precision, int scale,
int displaySize) {
if (jdbcTypeCode == Types.TIMESTAMP) {
return 9;
}

return super.resolveSqlTypeLength(columnTypeName, jdbcTypeCode, precision, scale, displaySize);
}
}
Но похоже, что метод не вызывается.
Есть ли у кого-нибудь идеи: как настроить TIMESTAMP(9) для всех временных меток (

Код: Выделить всё

LocalDateTime
...) по умолчанию? Репозиторий git для тестов можно найти: https://gitlab.com/RalphEng/experiment- ... 2-datetime

Справочная информация: сценарии использования — Spring Tests. Запускаю Spring и память H2 для теста. И у меня есть много тестов, которые содержат такие тесты:

Код: Выделить всё

MyEntity myEntity = new MyEntity ();
myEntity.timestamp = LocalDateTime.now();
myEntity.xzy = ....

entityManager.persist(myEntity);
entityManager.flush();
entityManager.clear();

MyEntity reloaded = entityManager.find(MyEntity .class, myEntity.getId());
assertThat(reloaded.timestamp).isEqualsTo(myEntity.timestamp)
//otherFieldsTo
Честно говоря, тесты в большинстве случаев не такие простые, и проверка того, что временная метка точно такая же, на самом деле не предназначена и не нужна. Но я не могу это исправить. Таким образом, повышение точности — это всего лишь обходной путь для тестов.
И поскольку это всего лишь «проблема» в тестах, я не могу добавить @Column(columnDefinition = "TIMESTAMP(9)"), потому что это также изменит поведение производства.

Подробнее здесь: https://stackoverflow.com/questions/787 ... -precision
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»