2

私のエンティティにはこの属性があります...

@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

データベースで Select direct を実行すると、値は正しいです。

2016-05-09 15:20:00.3570000

しかし、JPA でこの値を回復すると、値が間違っています。

2016-05-07T15:20:00.357

日が2日で間違っていることに注意してください。

したがって、データ型を手動で変更すると、すべて正常に動作します。なにが問題ですか?

私のコンバーター:

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;
     }
   }

私はwildfly 9でMicrosofr jdbc42を使用しています

4

1 に答える 1

1

古い JDBC ドライブを使用していますか?

Java7 を使用した SQL Server の JDBC バージョン 3 には問題があります: 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

テストコード:

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();
}
于 2016-06-21T19:21:56.533 に答える