Java Persistence / JPA: @Column so với @Basic


119

Sự khác biệt giữa @Column@Basicchú thích trong JPA là gì? Chúng có thể được sử dụng cùng nhau? Chúng có nên được sử dụng cùng nhau không? Hay một trong số chúng đủ?

Câu trả lời:


147
  • @Basicbiểu thị rằng một thuộc tính sẽ được duy trì và một ánh xạ chuẩn sẽ được sử dụng. Nó có các tham số cho phép bạn chỉ định liệu thuộc tính có được tải một cách chậm rãi hay không và liệu nó có thể vô hiệu hóa hay không.

  • @Column cho phép bạn chỉ định tên của cột trong cơ sở dữ liệu mà thuộc tính sẽ được duy trì.

Nếu bạn chỉ định cái này mà không có cái kia thì bạn sẽ nhận được hành vi mặc định là hợp lý, vì vậy thông thường mọi người chỉ sử dụng một hành vi ngoại trừ các trường hợp đặc biệt.

Vì vậy, nếu chúng ta muốn tải một cách chậm một thuộc tính và chỉ định tên cột, chúng ta có thể nói

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

Nếu chúng ta cần hành vi mặc định, không lười biếng thì chỉ cần hành vi @Columnsẽ là đủ.


2
Đây là một câu trả lời rõ ràng. Cảm ơn bạn. Vì vậy, tôi giả sử một người có thể sử dụng @Basicmà không cần @Column, đó là lý do tại sao các thuộc tính optionalnullablethuộc tính tồn tại trong cả hai. Tôi nói đúng chứ?
Hosam Aly

1
Tôi không khẳng định mình hiểu đầy đủ thông số JPA về sự khác biệt giữa khả năng vô hiệu của @ Basic và không thể vô hiệu của @ Column và ảnh hưởng của việc chỉ định cả hai hoặc không. @Basic nullable được mô tả như một "gợi ý" liên quan đến việc tạo giản đồ. @Column nullable được mô tả là xác định các đặc điểm của cột trong cơ sở dữ liệu. Cách thực hành của tôi là sử dụng trường hợp @Column.
djna

16
@Basic (tùy chọn) được (nên) kiểm tra trong thời gian chạy bởi nhà cung cấp độ bền trước khi lưu vào DB. @Column là định nghĩa cột trong cơ sở dữ liệu và được sử dụng để tạo giản đồ: stackoverflow.com/questions/2899073/…
Piotr Gwiazda

2
"không lười biếng", gọi là EAGER. LOL
giải quyết

7
Chú thích JPA có thể được chia thành hai nhóm: chú thích quan hệ thuần túy và chú thích triển khai. Các chú thích quan hệ thuần túy chứa: Entity, Basic, OneToOne, OneToMany, ManyToMany, ... trong khi chú thích triển khai cung cấp manh mối về cách ánh xạ mô hình lý thuyết thuần túy với cơ sở dữ liệu thực: Bảng, Cột, ... Trong câu hỏi của bạn 'Cơ bản 'là một chú thích để cung cấp thông tin về thuộc tính thực thể quan hệ trong khi' Cột 'cung cấp thông tin về cách ánh xạ nó với một cột cơ sở dữ liệu.
Bruno Ranschaert

50

Ngoài câu trả lời của @ djna , điều đáng chú ý là @Basicnên so sánh với @OneToMany, @ManyToOne@ManyToMany. Chỉ một trong số này có thể được chỉ định trên bất kỳ tài sản nào.

@Column@JoinColumncó thể được chỉ định cùng với bất kỳ trong số này để mô tả các thuộc tính cột cơ sở dữ liệu.

Đây là hai bộ chú thích có thể được sử dụng cùng nhau, nhưng chỉ có thể sử dụng một chú thích của mỗi bộ tại một thời điểm.


21

Điều đáng chú ý là Basic được thiết kế cho các trường nguyên thủy

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

Thuộc tính cơ bản là thuộc tính mà lớp thuộc tính là một kiểu đơn giản như Chuỗi, Số, Ngày hoặc một nguyên thủy. Giá trị của một thuộc tính cơ bản có thể ánh xạ trực tiếp đến giá trị cột trong cơ sở dữ liệu.

Các loại và chuyển đổi được hỗ trợ phụ thuộc vào việc triển khai JPA và nền tảng cơ sở dữ liệu. Bất kỳ thuộc tính cơ bản nào sử dụng kiểu không ánh xạ trực tiếp đến kiểu cơ sở dữ liệu đều có thể được tuần tự hóa thành kiểu cơ sở dữ liệu nhị phân.

Cách dễ nhất để ánh xạ một thuộc tính cơ bản trong JPA là không làm gì cả. Bất kỳ thuộc tính nào không có chú thích khác và không tham chiếu đến các thực thể khác sẽ được tự động ánh xạ dưới dạng cơ bản và thậm chí được tuần tự hóa nếu không phải là loại cơ bản. Tên cột cho thuộc tính sẽ được đặt mặc định, được đặt tên giống như tên thuộc tính, là chữ hoa.


Lưu ý tốt. Cảm ơn bạn.
Hosam Aly

1
Không, Nếu không có chú thích Cột nào được chỉ định, các giá trị mặc định sẽ được áp dụng (tên sẽ là thuộc tính).
Gab

2

Chú thích @Basic được áp dụng cho các thực thể JPA và @Column được áp dụng cho các cột cơ sở dữ liệu Thuộc tính tùy chọn của chú thích @Basic xác định liệu trường thực thể có thể là rỗng hay không; Mặt khác,

  • Thuộc tính nullable của chú thích @Column chỉ định liệu cột cơ sở dữ liệu tương ứng có thể là null hay không
  • Chúng tôi có thể sử dụng @Basic để chỉ ra rằng một trường nên được tải một cách chậm rãi
  • Chú thích @Column cho phép chúng tôi chỉ định tên của cột cơ sở dữ liệu được ánh xạ
  • Chú thích @Basic đánh dấu thuộc tính không phải là tùy chọn ở cấp đối tượng Java. Và (nullable = false) trên ánh xạ cột, chỉ chịu trách nhiệm về việc tạo ra ràng buộc cơ sở dữ liệu NOT NULL.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.