2012-04-06 27 views
86

tôi đang trải qua phần hệ Id của hướng dẫn tham khảo Hibernate và "Java Persistence với Hibernate"Làm thế nào để lựa chọn chiến lược thế hệ id khi sử dụng JPA và Hibernate

Có khá một vài lựa chọn có sẵn với Hibernate và JPA kết hợp .

Tôi đang tìm thêm tài liệu về cách chọn chiến lược tạo id cụ thể.

Tôi cũng đang tìm các điểm đến hạn.

Ví dụ: chiến lược hilo được dự kiến ​​sẽ giảm tranh chấp. Tôi giả định rằng phải có một giao dịch liên kết với lựa chọn này.

Tôi muốn được giáo dục về việc giảm giá.

Có tài liệu nào không?

Trả lời

79

API Doc rất rõ ràng về điều này.

Tất cả các trình tạo đều triển khai giao diện org.hibernate.id.IdentifierGenerator. Đây là một giao diện rất đơn giản. Một số ứng dụng có thể chọn cung cấp các triển khai chuyên biệt của riêng mình, tuy nhiên, Hibernate cung cấp một loạt các triển khai được cài sẵn. Các tên shortcut cho các máy phát điện được xây dựng-in như sau:

increment

tạo ra định danh của loại dài, ngắn hoặc int mà là duy nhất chỉ khi không có quá trình khác được chèn dữ liệu vào cùng một bảng. Không sử dụng trong một cụm.

sắc

hỗ trợ cột sắc trong DB2, MySQL, MS SQL Server, Sybase và HypersonicSQL. Số nhận dạng được trả về là loại dài, ngắn hoặc int.

chuỗi

sử dụng một chuỗi trong DB2, PostgreSQL, Oracle, SAP DB, McKoi hoặc một máy phát điện trong Interbase. Từ định trở lại là loại dài, ngắn hoặc int

Hilo

sử dụng một thuật toán hi/lo để tạo ra hiệu quả định danh của loại dài, ngắn hoặc int, được đưa ra một bảng và cột (bằng hibernate_unique_key mặc định và next_hi tương ứng) như một nguồn giá trị hi. Thuật toán hi/lo tạo ra các định danh duy nhất chỉ cho một cơ sở dữ liệu cụ thể.

seqhilo

sử dụng một thuật toán hi/lo để tạo ra hiệu quả định danh dài, ngắn loại hoặc int, được đưa ra một chuỗi cơ sở dữ liệu được đặt tên.

uuid

sử dụng một thuật toán UUID 128-bit để tạo ra định danh kiểu string đó là duy nhất trong một mạng (địa chỉ IP được sử dụng). UUID được mã hóa dưới dạng chuỗi gồm 32 chữ số thập lục phân.

guid

sử dụng một GUID chuỗi cơ sở dữ liệu được tạo ra trên MS SQL Server và MySQL.

mẹ đẻ

chọn sắc, chuỗi hoặc Hilo phụ thuộc vào khả năng của cơ sở dữ liệu cơ bản.

giao

cho phép các ứng dụng gán một định danh cho các đối tượng trước khi tiết kiệm() được gọi. Đây là chiến lược mặc định nếu không có phần tử nào được chỉ định.

chọn

lấy một khóa chính, bằng cách kích hoạt một cơ sở dữ liệu được giao, bằng cách chọn hàng bởi một số khóa duy nhất và lấy giá trị khóa chính.

ngoại

sử dụng nhận dạng của một đối tượng liên quan. Nó thường được sử dụng kết hợp với một hiệp hội quan trọng chính.

chuỗi-sắc

một chiến lược thế hệ thứ tự đặc biệt mà sử dụng một chuỗi cơ sở dữ liệu cho thế hệ giá trị thực tế, nhưng kết hợp này với getGeneratedKeys JDBC3 để trả về giá trị định danh được tạo ra như một phần của việc thực hiện tuyên bố chèn. Chiến lược này chỉ được hỗ trợ trên các trình điều khiển Oracle 10g được nhắm mục tiêu cho JDK 1.4. Nhận xét về các câu lệnh chèn này bị tắt do lỗi trong trình điều khiển của Oracle.

Nếu bạn đang xây dựng một ứng dụng đơn giản với không nhiều người dùng đồng thời, bạn có thể đi increment, bản sắc, Hilo vv .. Đây là những đơn giản để cấu hình và không cần nhiều mã hóa bên trong db.

Bạn nên chọn trình tự hoặc guid tùy thuộc vào cơ sở dữ liệu của bạn. Đây là những an toàn và tốt hơn bởi vì thế hệ id sẽ xảy ra bên trong cơ sở dữ liệu.

Cập nhật: Gần đây, chúng tôi đã gặp sự cố với nguyên nhân nơi loại nguyên thủy (int) được sửa bằng cách sử dụng loại trình điều khiển (Integer) thay thế.

+0

Cảm ơn bạn rất nhiều vì đã trả lời. Tôi đã xem tài liệu rồi. Tuy nhiên, tôi đang tìm kiếm lý do tại sao mọi người sẽ sử dụng một cái gì đó như hilo và seqhilo. Khi nào chúng ta thực hiện lựa chọn đó. Các trường hợp sử dụng để chọn. –

+0

Khi có thứ gì đó đơn giản như trình tự hoặc hướng dẫn, điều gì có thể yêu cầu nhà phát triển chọn các con đường khác. –

+1

Tôi đã cập nhật câu trả lời của mình. Trên thực tế ** tăng, nhận dạng, hilo ** vv .. đơn giản hơn. nhưng chúng không thích hợp cho các ứng dụng doanh nghiệp. Giữ tất cả các tùy chọn không phải là vấn đề, nhưng hãy đảm bảo bạn sử dụng tùy chọn phù hợp nhất cho mình! – ManuPK

19


Một thời gian trước đây tôi đã viết một bài viết chi tiết về Hibernate máy phát điện chính: http://blog.eyallupu.com/2011/01/hibernatejpa-identity-generators.html

Chọn máy phát điện đúng là một nhiệm vụ phức tạp nhưng điều quan trọng là để thử và nhận được nó ngay càng sớm càng tốt - một cuối di cư có thể là một cơn ác mộng.

Một chủ đề nhỏ nhưng một cơ hội tốt để tăng điểm thường bị bỏ qua là chia sẻ khóa giữa các ứng dụng (qua API). Cá nhân tôi luôn thích các khóa thay thế và nếu tôi cần giao tiếp các đối tượng của mình với các hệ thống khác, tôi không để lộ khóa của mình (mặc dù nó là một khóa thay thế) - Tôi sử dụng thêm ‘khóa ngoài’.Là một nhà tư vấn, tôi đã thấy nhiều hơn một lần tích hợp hệ thống 'tuyệt vời' bằng cách sử dụng các khóa đối tượng (phương pháp 'đó là hãy sử dụng nó') chỉ để tìm một hoặc hai năm sau đó một bên có vấn đề với phạm vi chính hoặc loại yêu cầu di chuyển sâu trên hệ thống để lộ các khóa bên trong của nó. Việc phơi bày chìa khóa của bạn có nghĩa là việc phơi bày một khía cạnh cơ bản của mã của bạn với các ràng buộc bên ngoài không thực sự được tiếp xúc.

32

Về cơ bản, bạn có hai lựa chọn chính:

  • Bạn có thể tạo ra các định danh chính mình, trong trường hợp mà bạn có thể sử dụng một assigned identifier.
  • Bạn có thể sử dụng chú thích @GeneratedValue và Hibernate sẽ chỉ định số nhận dạng cho bạn.

Đối với định danh được tạo ra bạn có hai lựa chọn:

Đối định số you have three options:

  • SẮC
  • SEQUENCE
  • TABLE

SẮC chỉ là một lựa chọn tốt khi bạn không thể sử dụng SEQUENCE (ví dụ MySQL) vì it disables JDBC batch updates.

SEQUENCE là tùy chọn ưu tiên, đặc biệt khi được sử dụng với trình tối ưu hóa số nhận dạng như pooled or pooled-lo.

TABLE is to be avoided at any cost vì nó sử dụng giao dịch riêng để tìm mã định danh và khóa cấp hàng có quy mô kém.

2

Tôi tìm thấy bài giảng này rất có giá trị https://vimeo.com/190275665, ở điểm 3 nó tóm tắt những máy phát điện này và cũng cung cấp một số phân tích hiệu suất và hướng dẫn khi bạn sử dụng từng cái.

+1

Video đó trông rất quen thuộc. –

+1

@VladMihalcea Vâng, đó là hahahahah;) Rất tốt! – Adelin

Các vấn đề liên quan