2017-04-11 1 views
0

Ich habe eine Entität, die zwei Daten enthält, fromDate und toDate, und wenn ich es nicht überprüfe, funktioniert es perfekt, aber wenn ich die @Audited Annotation hinzufüge, erhalte ich den folgenden Fehler :Hibernate @Audited schlägt beim Speichern von Daten fehl

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1' for column 'from_date_mod' at row 1 

Meine Entity ist wie diese:

@Entity 
@Audited 
public class MyEntity { 

    @Id 
    @GeneratedValue 
    private BigInteger id; 

    @NotNull 
    private Date fromDate; 

    private Date toDate; 
    .... 
} 

Und mein Skript ist liquibase diese:

databaseChangeLog: 
    - changeSet: 
     id: 1 
     author: Manuel 
     changes: 
     - createTable: 
      tableName: my_table 
      columns: 
       - column: 
        name: id 
        type: BIGINT 
        autoIncrement: true 
        constraints: 
        primaryKey: true 
        nullable: false 
       - column: 
        name: from_date 
        type: datetime 
        constraints: 
        nullable: false 
       - column: 
        name: to_date 
        type: datetime 
    - changeSet: 
     id: 2 
     author: Manuel 
     comment: Create Hibernate Envers audit table for my_table 
     changes: 
     - createTable: 
      tableName: my_table_aud 
      columns: 
       - column: 
        name: id 
        type: BIGINT 
        autoIncrement: true 
        constraints: 
        primaryKey: true 
        nullable: false 
       - column: 
        name: rev 
        type: BIGINT 
        constraints: 
        nullable: false 
        primaryKey: true 
        foreignKeyName: my_table_aud_revinfo_fk 
        referencedTableName: revinfo 
        referencedColumnNames: rev 
       - column: 
        name: revtype 
        type: TINYINT 
        defaultValue: null 
       - column: 
        name: from_date 
        type: datetime 
        defaultValue: null 
       - column: 
        name: from_date_mod 
        type: datetime 
        defaultValue: null 
       - column: 
        name: to_date 
        type: datetime 
        defaultValue: null 
       - column: 
        name: to_date_mod 
        type: datetime 
        defaultValue: null 

Also, es ist etwas mit @Audited verwandt, denn wenn ich die Annotation entferne, funktioniert es.

Wissen Sie, warum ich den Fehler bekomme? Ich würde es vorziehen, wenn möglich, die Java-Typen des Feldes der MyEntity-Klasse nicht zu ändern.

Antwort

1

Der Grund für den Fehler ist, dass Ihr liquidbase-Skript falsch ist.

Die Feldunterstützung für geänderte Flags erwartet, dass die Felder ..._mod einem booleschen Typ angehören, der einen Indikator speichert, der true oder darstellt. Dies hängt vom Dialekt ab, welcher Typ von für boolesche Werte gewählt wird, was etwa tinyint oder bit usw. sein könnte.

Sobald Sie das ändern, würde ich erwarten, dass das Verhalten funktionieren sollte.

+0

Hallo Naros, danke fürs Antworten. Ich glaube nicht, dass ich deine Antwort richtig verstanden habe. Aber, sagen wir mal, ich habe einige andere Tabellen, und ich habe die Mod-Spalten als die normalen definiert, und es funktioniert. Es schlägt nur mit dem Datumstyp fehl. – Manuelarte

+0

Dann führt die Datenbank möglicherweise eine Inline-Nullung der Datentypen durch und gibt Ihnen die Illusion, dass alles in Ordnung ist. Offensichtlich sind Datumsangaben sehr spezifische Fälle, deren eindeutige Anforderungen als gültig betrachtet werden müssen, sodass Sie den Fehler sehen. Wenn ich zum Beispiel ein 'VARCHAR'-Feld in SQL Server habe, würde das zugehörige Mod-Feld den Datentyp von' BIT' haben, um 0 = falsch und 1 = wahr darzustellen. Welchen Dialekt benutzen Sie? – Naros

+0

Hallo Nano, ich verwende den MySQL-Dialekt: org.hibernate.dialect.MySQLDialect. Btw, Ich habe die Trace-Protokollierung hinzugefügt und ich habe die Werte der Abfragen gesehen, und Sie haben absolut Recht, es erwartet einen booleschen Wert. – Manuelarte

Verwandte Themen