@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