【问题标题】:Primitive type in JPA mapping. What if the database column may be NULL?JPA 映射中的原始类型。如果数据库列可能为 NULL 怎么办?
【发布时间】:2013-01-31 09:11:27
【问题描述】:

假设这个类使用 JPA 映射(使用 JPA 1.0 和 Hibernate):

@Entity
public class Foo {

    private int bar;

    /* ... */
}
  1. 如果我尝试加载一条 BAR 列设置为 NULL 的记录会怎样?
  2. 能否指定bar字段对应列为NULL时如何设置?

注意事项

我知道这不是最佳做法。这个问题更多是出于好奇,并受到这种情况的启发:

  • 数据库表是一个临时表:添加NOT NULL 约束是不切实际的。错误数据是意料之中的,我的代码的重点是在将数据加载到“真实”数据库之前验证、清理和/或拒绝数据。
  • 我对某些字段有可接受的默认值。例如,boolean 标志应默认为 false

【问题讨论】:

  • 如果 db 列可以包含 null 你真的应该使用包装类来表示值。

标签: java hibernate jpa orm primitive


【解决方案1】:
  1. 异常

2.

@Column(name = “bar”, nullable = false, columnDefinition = “bigint(20) default 0″)
private int bar;

它解决了你的问题。

【讨论】:

  • 但是对于第 2 点,我需要更改数据库列定义,不是吗?
  • 我同意,如果您真的想要 Null 表示,您应该将 bar 更改为 Integer。但是如果你想避免null,你可以设置一个默认值。
  • 顺便说一句,我认为原始类型已经有一个默认值。但是,如果您已经有一个包含空条目的列,则将 bar 更改为 Integer 是解决方案。
【解决方案2】:

如果列可能包含空值,我宁愿使用对象,因为 Matheus 的想法引入了错误数据。 NULL <> 0!

【讨论】:

  • 你能解释一下这里的虚假数据是什么意思吗? Matheus 将默认值设置为 0 和 nullable = false,因此它永远不会为空。错误/错误数据是什么意思?
  • columnDefinition用于 DDL 生成(即生成语句以创建和更改表),因此默认值将是原语的默认值。事实上,当您使用 JPA 时,您不应该创建具有默认值的列。如果您的字段是原始类型,它将默认为原始类型的默认值。如果您的字段是一个对象,数据库将设置您表中定义的默认值,但插入的实体对象中对应的列不会更新以反映默认值。
猜你喜欢
  • 2012-06-18
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2019-11-10
相关资源
最近更新 更多