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.
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
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
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