@Column(length= 50)和@Size(max= 50)之间有什么区别?


本文内容摘抄自 : thoughts-on-java

@Column(length= 50和@Size(max= 50)之间有什么区别?

题 :

我们的一些实体属性使用@Column(length= 50)进行注解,其他属性使用@Size(max = 50)注解,其他属性使用这两个注解进行注解。

两个注解之间有什么区别?我们使用哪一个会有什么不同吗?

或者我们需要它们吗?

解 :

虽然看起来两个注解看起来都是一样的,但是有一些重要的区别:

  1. 所述@Column注解是JPA规范的一部分,而@Size注解属于BeanValidation规范。因此,如果要使用@Size注解,则需要为项目添加其他依赖项。
  2. @Column批注的length属性指定数据库列的大小,仅在持久性提供程序生成数据库模式时使用。但@Size注解告诉您的BeanValidation实现在运行时执行适当的验证。
  3. 如果使用@Column批注并让持久性提供程序生成数据库模式,则数据库将拒绝任何长度超过50个字符的值。该@Size实体得到持续的或更新注解之前得到您的Java应用程序中进行评估。

我们来看一个例子吧。

使用@Column(size = 50) Annotation

如果使用@Column(size = 50)注解Book实体的title属性,Hibernate将唯一能够生成一个CREATE TABLE语句,将列的大小限制为50个字符。

@Entity
public class Book {
 
    @Id
    @GeneratedValue
    private Long id;
    
    @Column(length=50)
    private String title;
    ...
create table Book (
   id int not null,
   title varchar(50),
   version int4 not null,
   primary key (id)
)

如果使用该CREATE TABLE语句创建数据库表,则如果尝试在标题字段中存储超过50个字符,则数据库将返回错误。但是Hibernate不会在您的应用程序中执行任何验证。

使用@Size(max = 50)Annotation

让我们替换使用@Size(max = 50)注解而不是之前使用的@Column注解。

@Entity
public class Book {
 
    @Id
    @GeneratedValue
    private Long id;
     
    @Size(max=50)
    private String title;
 
    ...
}

正如我在前一篇文章中详细解释的那样,JPA和BeanValidation规范集成得非常好。在这种情况下,这提供了两个主要好处:

如果将Hibernate配置为生成数据库表,则将根据@Size批注定义的最大大小限制数据库列的大小。因此,您将获得与上一示例中相同的CREATE TABLE语句。

在持久化或更新实体之前,Hibernate将自动触发BeanValidation实现。这为您提供了另一层保护,它不依赖于特定的生成DDL语句的执行。

你应该使用哪一个?@Column(size = 50)或@Size(max = 50)?

正如您在前面的段落中看到的那样,Hibernate为两个注解生成相同的CREATE TABLE语句。但对于@Size注解,Hibernate会在插入或更新实体之前自动触发验证。

这使得@Size注解成为一种更安全更强大的方法来验证实体属性值的大小。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM