【问题标题】:Default column value in database table is null after persisting a entity持久化实体后,数据库表中的默认列值为空
【发布时间】:2011-11-22 14:53:56
【问题描述】:

从上图中,您可以看到 MySQL 数据库(表 Question)中的一列,其中有一列的默认值为“已批准”。但是,如果我创建一个新的 Question 实例,请在对象上设置值而不是在 status 属性上设置它在 status 列中保持 null 而不是使用默认值。我是否需要在 Java 代码中设置默认值? (我坚持的地方)

【问题讨论】:

    标签: java jakarta-ee jpa


    【解决方案1】:

    是的。当实体的持久字段为空时,JPA 不会忽略它。它在生成的插入/更新语句中将列设置为空。因此,您必须将其设置为 Java 中的默认值。实体的构造函数可能是设置此类默认值的合适位置。

    【讨论】:

    • 我正在使用 EclipseLink,但可能同样适用。
    • 它是内置的还是可配置的行为?
    • 同样的事情也适用于 EclipseLink。
    • 对不起,我经常把 JPA 等同于 Hibernate。这同样适用于 EclipseLink。它是不可配置的:持久化字段是持久化的,它的值是写入数据库的值。这是一件好事,因为它不是这样的,它必须在每次插入/更新后刷新实体以重新加载数据库设置的默认值。
    【解决方案2】:

    是的,你需要在你的实体类中提供默认映射,因为休眠不支持默认值(总是),你可以通过两种方式做到:

    1. 使用default 选项并在@Column 注释中提供值。这取决于数据库,需要检查这是否适用于 MySQL

    2. 正如其他海报所说,在构造函数中使用“已批准”值初始化您的变量

    也是非常相似的帖子here

    【讨论】:

      【解决方案3】:

      在 Java 中默认值是最好的。

      您还可以在 @Column 中将 insertable 设置为 false,但是除非您进行刷新,否则您的对象和数据库将不同步。

      EclipseLink 还支持从数据库返回字段值,但仅限于 Oracle(除非使用存储过程)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-30
        • 2015-11-10
        • 1970-01-01
        • 2019-07-04
        • 2015-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多