Theo những gì tôi biết, chiến lược GeneratedValue được dành riêng cho khóa chính, nghĩa là bạn chỉ có thể sử dụng nó một lần cho mỗi Đối tượng.
Tuy nhiên, tùy thuộc vào nhu cầu của bạn, bạn có một số tùy chọn:
-
Bạn luôn có thể có sự kiện vòng đời prePersist , đặt bất kỳ giá trị nào bạn thích cho tên trước khi bạn duy trì tên đó lần đầu tiên.
-
Nếu bạn phụ thuộc vào id để tạo một id duy nhất khác từ nó, bạn có thể triển khai một sự kiện postPersist, đặt tên của bạn ở đó và đảm bảo bạn xóa hai lần (Lần đầu tiên để tạo khóa chính, lần thứ hai để lưu tên).
-
Nếu bạn thấy tên trống trong cơ sở dữ liệu trong một thời gian, bạn có thể triển khai sự kiện postLoad, sự kiện này sẽ điền vào tên nếu nó trống. Bằng cách này, ứng dụng của bạn luôn nhìn thấy tên (vì nó được tải từ cơ sở dữ liệu hoặc được điền bởi sự kiện postLoad) và khi bạn thêm hoặc chỉnh sửa thông tin lần đầu tiên sau lần lưu đầu tiên, tên của bạn cũng sẽ được lưu
-
Bạn có thể không lưu tên và đặt tên đó được tạo bởi một số cronjob / deamon / queue để ứng dụng của bạn không phải xử lý nó. Điều duy nhất bạn cần làm là đảm bảo rằng một cái tên bị thiếu không làm hỏng điều gì đó.
-
Có thể bạn có thể tạo khóa không phụ thuộc vào khóa chính và do đó có thể được tạo bởi trình xử lý sự kiện toàn cầu . Tất nhiên, bạn có nhược điểm là trình xử lý sự kiện như vậy, bởi vì anh ta là toàn cầu, được gọi cho mọi đối tượng mà bạn tồn tại, bất kể đó có phải là thực thể chính xác hay không.
-
Cuối cùng, nhưng không kém phần quan trọng, có thể dự phòng cho Thủ tục / Trình kích hoạt được lưu trữ để cơ sở dữ liệu xử lý việc này. Bằng cách này, bạn không phải gặp rắc rối với điều này bên trong ứng dụng của mình. Nhưng hãy cẩn thận, có thể có những cạm bẫy trên đường đi (như một nhà phát triển quên điều này vì nó không nằm trong mã mà nằm trong cơ sở dữ liệu!).
Có thể có những cách khác. Điều tôi đang cố gắng nói là:Không sử dụng createdValue cho các thuộc tính không phải khóa chính!