2016-06-21 1 views
2

Моя сущность имеет этот атрибут ...JPA создание LocalDateTime колонны в виде datetime2 в SQLServer 2008

@Convert(converter = LocalDateTimeAtributeConverter.class) 
@Column(name="dthr_ult_atualizacao") 
private LocalDateTime ultimaAtualizacao; 

В сервере, столбец создается JPA как:

dthr_ult_atualizacao (datetime2(7), null) 

По коду, Я сохранить значение ниже в этой колонке:

2016-05-09T15:20:00.357 

Когда я делаю Выберите непосредственно в базе данных, значение correc т:

2016-05-09 15:20:00.3570000 

Но когда я восстановить это значение JPA, значение неверно:

2016-05-07T15:20:00.357 

Обратите внимание, что на следующий день не так в течение двух дней.

Итак, если я изменяю вручную тип данных, все работает нормально. Что не так?

Мой конвертер:

import java.time.LocalDateTime; 
import javax.persistence.AttributeConverter; 
import javax.persistence.Converter; 

@Converter 
public class LocalDateTimeAtributeConverter implements AttributeConverter<LocalDateTime, java.sql.Timestamp> { 

    @Override 
    public java.sql.Timestamp convertToDatabaseColumn(LocalDateTime entityValue)  
    { 
     if (entityValue != null) { 
      return java.sql.Timestamp.valueOf(entityValue); 
     } 
     return null; 
    } 

    @Override 
    public LocalDateTime convertToEntityAttribute(java.sql.Timestamp databaseValue) { 
     if (databaseValue != null) { 
      return databaseValue.toLocalDateTime(); 
     } 
     return null; 
    } 
    } 

Я использую Microsofr jdbc42 с wildfly 9

ответ

1

вы используете старый диск JDBC?

Есть проблема с JDBC версии SQL Server, 3 с Java7: https://support.microsoft.com/kb/2652061

Вы можете получить новую версию здесь: https://www.microsoft.com/en-us/download/details.aspx?id=11774

Я сделал несколько тестов и получили эти результаты:

Дата - Версия JDBC

2016-06-21 16: 19: 00.383 - 4.2.6420.100

2016-06-19 16: 19: 38,603 - 3.0.1301.101

код Teste:

public static void main(String[] args) throws Exception { 
    String url = "jdbc:sqlserver://localhost\\SQLEXPRESS;databasename=teste_date"; 
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
    Connection connection = DriverManager.getConnection(url,"sa", "password"); 

    Date time = Calendar.getInstance().getTime(); 

    PreparedStatement psDel = connection.prepareStatement("delete from teste"); 
    psDel.executeUpdate(); 
    psDel.close(); 

    PreparedStatement psInsert = connection.prepareStatement("insert into teste values (? , ?)"); 
    psInsert.setInt(1, 1); 
    psInsert.setTimestamp(2, new Timestamp(time.getTime())); 
    psInsert.executeUpdate(); 
    psInsert.close(); 

    PreparedStatement ps = connection.prepareStatement("select * from teste"); 
    ResultSet rs = ps.executeQuery(); 
    String driverVersion = connection.getMetaData().getDriverVersion(); 
    while (rs.next()) { 
     Timestamp date = rs.getTimestamp(2); 
     System.out.println(date + " - " + driverVersion); 
    } 
    rs.close(); 
    ps.close(); 

    connection.close(); 
} 
+1

Спасибо. В том, что. Вы решили мою проблему. –

Смежные вопросы