【问题标题】:Hibernate @Audited fails when saving dates保存日期时休眠 @Audited 失败
【发布时间】:2017-09-07 11:10:19
【问题描述】:

我有一个实体,其中包含两个日期,fromDate 和 toDate,如果我不审核它,它可以正常工作,但是,如果我添加 @Audited 注释,我会收到以下错误:

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

我的实体是这样的:

@Entity
@Audited
public class MyEntity {

    @Id
    @GeneratedValue
    private BigInteger id;

    @NotNull
    private Date fromDate;

    private Date toDate;
    ....
}

我的 liquibase 脚本就是这个:

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

所以,它与@Audited 相关,因为如果我删除注释,它会起作用。

你知道我为什么会收到错误吗?如果可能的话,我不希望更改 MyEntity 类的字段的 java 类型。

【问题讨论】:

    标签: hibernate spring-boot hibernate-envers audit-tables


    【解决方案1】:

    您收到错误的原因是您的liquidbase 脚本不正确。

    修改后的标志字段支持要求 ..._mod 字段为布尔类型,存储表示 truefalse 的指示符。这取决于方言选择布尔值的类型,可能是tinyintbit 等。

    一旦你改变它,我希望这种行为应该起作用。

    【讨论】:

    • 您好 Naros,感谢您的回答。我认为我没有正确理解您的回答。但是,假设我有一些其他表,并且我将 mod 列定义为普通列,并且它正在工作,它只是在日期类型上失败。
    • 那么数据库可能正在对数据类型进行内联强制,给您一种一切都很好的错觉。显然,日期是非常特殊的情况,具有被视为有效的独特要求,因此您会看到错误。例如,如果我在 SQL Server 上有一个 VARCHAR 字段,则关联的 mod 字段将具有 BIT 的数据类型以表示 0=false 和 1=true。你用的是什么方言?
    • 嗨 Nano,我正在使用 MySQL 方言:org.hibernate.dialect.MySQLDialect。顺便说一句,我添加了跟踪日志,并看到了查询的值,你说得对,它需要一个布尔值。
    • 太棒了,只需更新您的列数据类型,您就应该准备就绪。祝你好运!
    猜你喜欢
    • 2011-09-06
    • 2012-01-18
    • 2012-12-26
    • 1970-01-01
    • 2011-08-17
    • 2018-11-05
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多