ChatGPT解决这个技术问题 Extra ChatGPT

Java 持久性/JPA:@Column 与 @Basic

JPA 中的 @Column@Basic 注释有什么区别?它们可以一起使用吗? 应该它们一起使用吗?或者其中一个就足够了?


A
AdrieanKhisbe

@Basic 表示要保留属性并使用标准映射。它具有允许您指定属性是否要延迟加载以及是否可以为空的参数。

@Column 允许您指定数据库中要保存属性的列的名称。

如果您指定一个而没有另一个,那么您将获得合理的默认行为,因此除了特殊情况外,通常人们只使用一个。

因此,如果我们想要延迟加载属性并指定列名,我们可以说

 @Basic(fetch=FetchType.LAZY)
 @Column(name="WIBBLE")

如果我们需要默认的非惰性行为,那么只需 @Column 就足够了。


这是一个明确的答案。谢谢你。所以我假设一个人可以在没有 @Column 的情况下使用 @Basic,这就是 optionalnullable 属性同时存在的原因。我对吗?
我并没有声称完全理解 JPA 规范关于 @Basic 的可空值和 @Column 的可空值之间的差异以及不指定任何一个或两个指定的效果。 @Basic nullable 被描述为与模式生成相关的“提示”。 @Column nullable 被描述为定义数据库中列的特征。我的做法是使用 @Column 案例。
@Basic(optional) 在保存到数据库之前(应该)由持久性提供程序在运行时检查。 @Column 是数据库中的列定义,用于生成模式:stackoverflow.com/questions/2899073/…
那个'非懒惰',调用EAGER。哈哈
JPA 注释可以分为两组:纯关系注释与实现注释。纯关系注释包含:Entity、Basic、OneToOne、OneToMany、ManyToMany……而实现注释提供了有关如何将纯理论模型映射到真实数据库的线索:表、列……在您的问题“基本”中' 是一个注释,用于提供有关关系实体属性的信息,而 'Column' 提供有关如何将其映射到数据库列的信息。
H
Hosam Aly

除了 @djna's answer 之外,值得注意的是,@Basic 应与 @OneToMany@ManyToOne@ManyToMany 进行比较。在任何属性上只能指定其中之一。

@Column@JoinColumn 可以与其中任何一个一起指定以描述数据库列属性。

这是可以一起使用的两组注解,但每组一次只能使用一个注解。


C
Community

值得注意的是,Basic 是为原始字段设计的

http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes

基本属性是属性类是简单类型(例如字符串、数字、日期或原始类型)的属性。基本属性的值可以直接映射到数据库中的列值。支持的类型和转换取决于 JPA 实现和数据库平台。任何使用不直接映射到数据库类型的类型的基本属性都可以序列化为二进制数据库类型。在 JPA 中映射基本属性的最简单方法是什么都不做。任何没有其他注释且不引用其他实体的属性将被自动映射为基本类型,如果不是基本类型,甚至会被序列化。属性的列名将被默认,命名与属性名相同,为大写。


否,如果未指定列注释,则应用默认值(名称将是属性一)。
S
Sonu patel

@Basic 注解应用于 JPA 实体,@Column 应用于数据库列 @Basic 注解的可选属性定义实体字段是否可以为空;另一方面,

@Column注解的可空属性指定对应的数据库列是否可以为空

我们可以使用@Basic 来指示一个字段应该被延迟加载

@Column 注解允许我们指定映射的数据库列的名称

@Basic 注释将属性标记为在 Java 对象级别上不是可选的。而(nullable = false) 对列映射,只负责生成一个NOT NULL 数据库约束。