【问题标题】:JPA : Database DEFAULT initializationJPA:数据库默认初始化
【发布时间】:2018-07-27 14:28:58
【问题描述】:

TL;DR :你能告诉JPA,如果它为空,请不要将这个值插入数据库?让数据库DEFAULT出来吧。

加长版

假设我在一个表中有以下数据库列:

IS_JOE_COOL_FLAG VARCHAR2(1 BYTE) DEFAULT 'N' NOT NULL 

假设我有一个 REST 服务,其中 IS_JOE_COOL_FLAG 是一个可选参数。即用户可能会发送它,也可能不会。

我想要做的是告诉我的 java 代码,使用 JPA,如果相同的 REST 参数为空,则不要在数据库列 IS_JOE_COOL_FLAG 中插入任何内容。让数据库来做这件事。

这样的问题已经存在于 Stack 上,位于 here

所选答案的作者发表以下声明:

这里选择务实的方法,初始化java中的所有值。从未听说过告诉 JPA/Hibernate 在插入/更新中省略空值的方法。

相反,他认为你应该告诉 JPA 发送什么。

第二个答案的作者说这个问题可以用下面的代码解决:

@Column(insertable = false)

查看一些documentation,以及答案下方的 cmets,此标志不能解决该问题。它完全防止 从被插入的列,句号。我已经在我的本地机器上对此进行了测试,并且文档和 cmets 确实进行了检查。

还有其他建议,说明 DEFAULT 代码可以放在JPA 实体的列定义中。但是,在我看来,这违背了在SQL 端创建默认评论的目的。

既然这个问题已经发布了大约 8 年,(如果我错过了更新的版本,我深表歉意),如果有一个实际的解决方案,我仍然有点困惑。

【问题讨论】:

  • 我认为没有为空的列的 INSERT 将下降到它的默认值,尝试寻找一种忽略它的方法

标签: java jpa


【解决方案1】:

如果字段丢失,一种方法可能是在数据库端进行验证以使事务失败:也就是要求它存在。这种类型的验证是否有特定原因需要通过 JPA 而不是通过服务层?一个简单的空检查可以完全阻止数据库调用。

【讨论】:

  • 我认为默认关键字应该完全一样
  • 虽然这只是一个例子,但此时修改数据库层绝对不是一种选择。
【解决方案2】:

您可以定义 @Converter 并覆盖其 convertToDataBaseColumn() 以始终插入 null ...因此将使用默认 DB 值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2015-02-25
    • 2014-11-30
    • 1970-01-01
    • 2014-12-29
    • 2012-11-29
    • 2012-01-06
    相关资源
    最近更新 更多