Spring-boot JPA несколько источников данных не обновляет и не создает таблицы

Поздравляем, вы поразили мою любимую пизду с помощью JDBC: обработка класса даты.

В основном базы данных обычно поддерживают как минимум три формы полей даты и времени, которые являются датой, временем и меткой времени. Каждый из них имеет соответствующий класс в JDBC, и каждый из них расширяется java.util.Date . Быстрая семантика каждого из этих трех выглядит следующим образом:

  • java.sql.Date соответствует SQL DATE, что означает, что он хранит лет, месяцев и дней , в то время как час, минута, секунда и миллисекунда игнорируются. Кроме того, sql.Date не привязан к часам.
  • java.sql.Time соответствует SQL TIME, и, как должно быть очевидно, содержит только информацию о часах, минутах, секундах
  • java.sql.Timestamp соответствует SQL TIMESTAMP, который является точной датой на наносекунду (примечание [8], что util.Date поддерживает только миллисекунды! ) с настраиваемой точностью.

Одной из наиболее распространенных ошибок при использовании драйверов JDBC в отношении этих трех типов является то, что типы обрабатываются некорректно. Это означает, что sql.Date является специфичным для часового пояса, sql.Time содержит текущий год, месяц и день и т. Д.

Наконец: какой из них использовать?

Зависит от SQL тип поля, действительно. PreparedStatement имеет сеттеры для всех трех значений, #setDate() является тем, который для sql.Date, #setTime() для sql.Time и #setTimestamp() для sql.Timestamp.

Обратите внимание, что если вы используете ps.setObject(fieldIndex, utilDateObject); вы можете дать нормальный util.Date большинству драйверов JDBC, которые будут счастливо пожирать его, как если бы он был правильного типа, но когда вы запрашиваете данные позже, вы можете заметить, что на самом деле у вас отсутствует материал.

Я действительно говорю, что ни один из Дат не должен использоваться вообще.

Я говорю, что сохраняйте миллисекунды / наносекунды как простые длинные и конвертируйте их в любые объекты, которые вы используете ( обязательный шлейф joda-времени ). Один хакерский способ, который можно сделать, - сохранить компонент даты как один длинный и временной компонент как другой, например, сейчас будет 20100221 и 154536123. Эти магические числа могут использоваться в SQL-запросах и будут переносимыми из базы данных в другую и позволит вам избежать этой части API JDBC / Java Date: s полностью.

1
задан Brian Tompsett - 汤莱恩 18 January 2019 в 11:38
поделиться

1 ответ

Попробуйте явно установить свойства JPA

    LocalContainerEntityManagerFactoryBean em = 
builder.dataSource(dataSource).packages("it.project.sol.sharpapi.entity.sharp").build();
            HashMap<String, Object> properties = new HashMap<>();
            properties.put("hibernate.hbm2ddl.auto", "update");
            properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
            em.setJpaPropertyMap(properties);
0
ответ дан Alexey.S 18 January 2019 в 11:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: