本文內容摘抄自 : thoughts-on-java
@Column(length= 50和@Size(max= 50)之間有什么區別?
題 :
我們的一些實體屬性使用@Column(length= 50)
進行注解,其他屬性使用@Size(max = 50)
注解,其他屬性使用這兩個注解進行注解。
兩個注解之間有什么區別?我們使用哪一個會有什么不同嗎?
或者我們需要它們嗎?
解 :
雖然看起來兩個注解看起來都是一樣的,但是有一些重要的區別:
- 所述
@Column
注解是JPA規范的一部分,而@Size
注解屬於BeanValidation
規范。因此,如果要使用@Size
注解,則需要為項目添加其他依賴項。 @Column
批注的length屬性指定數據庫列的大小,僅在持久性提供程序生成數據庫模式時使用。但@Size
注解告訴您的BeanValidation
實現在運行時執行適當的驗證。- 如果使用
@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
注解成為一種更安全,更強大的方法來驗證實體屬性值的大小。