Tìm hiểu về annotation @Column trong JPA

Trong trường hợp tên column của table trong database mà các bạn đang làm việc không giống với tên của entity mà các bạn đang định nghĩa, các bạn có thể sử dụng annotation @Column để thay đổi tên này. Ở đây, còn một số chức năng khác mà annotation này hỗ trợ cho chúng ta. Hãy cùng nhau tìm hiểu về nó trong bài viết này các bạn nhé!

Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:

Tìm hiểu về annotation @Column trong JPA

Maven dependencies:

Trong bài viết này, mình sẽ dùng database là MySQL với một table tên là clazz, được định nghĩa với cấu trúc như sau:

Entity của table này được định nghĩa ban đầu như sau:

Nội dung tập tin cấu hình của JPA:

Application class:

OK, vậy là mọi thứ chuẩn bị đã xong, giờ chúng ta sẽ đi vào chủ đề chính của bài viết này nhé các bạn!

Trong ví dụ của mình, bởi vì các thuộc tính của entity Clazz đều giống với tên của các column trong bảng clazz nên mình không cần sử dụng @Column annotation cũng được:

Khi đó, các bạn có thể insert record mới vào table clazz mà không có vấn đề gì cả.

Tìm hiểu về annotation @Column trong JPA

Nếu thuộc tính name của entity Clazz là một giá trị khác, ví dụ mình đổi thành className, thì chúng ta cần phải khai báo để sử dụng annotation @Column như sau:

Kết quả cũng vậy:

Tìm hiểu về annotation @Column trong JPA

Trong annotation @Column, ngoài thuộc tính name ra, chúng ta còn có thể khai báo các thuộc tính khác như sau (đa số các thuộc tính này dùng để định nghĩa cấu trúc của column, cần thiết khi chúng ta sử dụng JPA Tool để generate table từ entity) :

columnDefinition

Thuộc tính này cho phép các bạn sử dụng ngôn ngữ định dạng dữ liệu (DDL) để định nghĩa cấu trúc của một column. Sau đó, chúng ta có thể generate table từ entity sử dụng JPA Tool với định nghĩa này. Sử dụng thuộc tính này, các bạn có thể định nghĩa độ dài giá trị của cột (length), độ chính xác (precision) dành cho column với kiểu giá trị DECIMAL, khả năng mở rộng (scale) cũng dành cho column với kiểu giá trị DECIMAL, có được phép null hay không (nullable), có tính duy nhất không (unique).

Ví dụ, các bạn có thể định nghĩa column name sử dụng annotation @Column với thuộc tính columnDefinition như sau:

Khi sử dụng JPA Tool để generate table thì column này sẽ có cấu trúc như sau:

insertable
Thuộc tính này được sử dụng để cho phép sử dụng column này trong câu lệnh INSERT hay không? Mặc định giá trị của thuộc tính này là true, nếu các bạn định nghĩa thuộc tính này là false như sau:

thì khi chạy lại ví dụ, các bạn sẽ thấy lỗi như sau:

length

Thuộc tính này định nghĩa độ dài giá trị của column. Nó sẽ bị override nếu các bạn đã định nghĩa độ dài của column trong thuộc tính columnDefinition.

nullable

Thuộc tính này định nghĩa có cho phép column này null hay không. Nó cũng sẽ bị override nếu các bạn đã định nghĩa trong thuộc tính columnDefinition.

precision

Thuộc tính này định nghĩa độ chính xác giá trị của column với kiểu giá trị DECIMAL. Nó cũng sẽ bị override nếu các bạn đã định nghĩa trong thuộc tính columnDefinition.

scale

Thuộc tính này định nghĩa khả năng mở rộng của column với kiểu giá trị DECIMAL. Nó cũng sẽ bị override nếu các bạn đã định nghĩa trong thuộc tính columnDefinition.

Một ví dụ với thuộc tính precision và scale là:

trong đó: 5 là precision còn 2 là scale. Giá trị của cột này có dạng như sau: 123.45, có thể làm tròn phần thập phân 2 chữ số.

table

Định nghĩa table mà column này thuộc về.

unique

Định nghĩa tính duy nhất của giá trị mà column này chứa. Có thể dùng để định nghĩa cho primary key column đấy các bạn!

updatable

Giống như thuộc tính insertable, thuộc tính này định nghĩa có cho phép sử dụng column này trong câu lệnh UPDATE hay không? Mặc định giá trị của thuộc tính này là true nha các bạn!


Add Comment