Я использую Spring JDBC для хранения объекта classifiedAd в моей базе данных MariaDB следующим образом:Spring JDBC MySQL/MariaDB данных усечена для столбца «датой_начала» в строке 1
public void insert(ClassifiedAd classifiedAd){
this.jdbcTemplate.update(new PreparedStatementCreator(){
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(INSERT_SQL, Statement.RETURN_GENERATED_KEYS);
...
ps.setTimestamp(6, new Timestamp(classifiedAd.getStartDate().getTimeInMillis()));
...
return ps;
}
}, keyHolder);
Объект classifiedAd имеет поле private Calendar startDate
что я конвертирую в java.sql.Timestamp
, прежде чем сопоставлять его с соответствующим столбцом start_date datetime null,
в базе данных.
Но при установке я получаю следующее предупреждение:
Dec 13, 2016 10:59:10 AM com.mchange.v2.c3p0.SQLWarnings logAndClearWarnings
INFO: Data truncated for column 'start_date' at row 1
java.sql.SQLWarning: Data truncated for column 'start_date' at row 1
at org.mariadb.jdbc.MariaDbConnection.getWarnings(MariaDbConnection.java:833)
at com.mchange.v2.c3p0.impl.NewProxyConnection.getWarnings(NewProxyConnection.java:907)
at com.mchange.v2.c3p0.SQLWarnings.logAndClearWarnings(SQLWarnings.java:42)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishResourceOnCheckin(C3P0PooledConnectionPool.java:285)
at com.mchange.v2.resourcepool.BasicResourcePool.attemptRefurbishResourceOnCheckin(BasicResourcePool.java:1606)
at com.mchange.v2.resourcepool.BasicResourcePool.access$200(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1228)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
Я действительно не понимаю, почему метка времени усечен, так как это указано here, что это правильный тип использовать. Любая помощь, пожалуйста?
РЕДАКТИРОВАТЬ
Эти значения, которые я получаю до и после вставки:
Начальное значение:
System.out.println(BankCardDAOTest.expiration_date.get(Calendar.DAY_OF_MONTH) + "/"
+ (classifiedAd.getStartDate.get(Calendar.MONTH) + 1) + "/"
+ classifiedAd.getStartDate.get(Calendar.YEAR) + " "
+ classifiedAd.getStartDate.get(Calendar.HOUR) + ":"
+ classifiedAd.getStartDate.get(Calendar.MINUTE) + ":"
+ classifiedAd.getStartDate.get(Calendar.SECOND));
====> 27/7/2016 4:3:54
После вставки и извлечения объекта:
dao.insert(classifiedAd);
classifiedAd = dao.select(classifiedAd.getId());
====> 27/7/2016 0:0:0
Любая помощь, пожалуйста?
Единственным, что я могу думать, что это дата выпуска в формате ... как хранятся даты на ваших таблицах mariadb ... можете ли вы опубликовать результат выражения select для этого поля? – Hackerman
Включите общий журнал на сервере MariaDB, запустите свой код, вы сразу увидите, что он отправляет, и почему выдается предупреждение. – elenst