2011-01-21 14 views
9

Khi lớp doanh nghiệp tạo một thực thể mới.), đây có phải là phương pháp sáp nhập thực hành xấu không?kết hợp một thực thể tách rời hoặc mới với đối tượng hiện có trong câu hỏi thực hành tốt nhất hibernate/jpa

public User add(User user){ 

    User existingUser = getUserDao().findByBusinessKey(user.getBusinessKey(), false); 
    user.setId(existingUser.getId()); 

    user = getUserDao().merge(user); 

    return user; 
} 

Tôi hỏi vì thiết lập ID một cách rõ ràng trên thực thể tách rời cảm thấy khá xa lạ với tôi, nhưng dù bằng và hashCode phương pháp của đối tượng người dùng được thực hiện một cách thích hợp, thiết lập ID ở đây là cách duy nhất để đảm bảo việc hợp nhất diễn ra.

Có thực tiễn nào tốt hơn không?

Có những hạn chế cụ thể nào đối với phương pháp này có thể khiến tôi khó chịu sau này không?

Cảm ơn bạn đã xem!

+1

Một điều mà đoạn mã của tôi không chứng minh thuộc tính đã thiết lập kết quả getUserDao(). Kết hợp (của người dùng) với tham chiếu người dùng ban đầu ... cập nhật đoạn mã để hiển thị điều đó. –

+0

Tại sao có ID (autogenerated) và khóa doanh nghiệp ở vị trí đầu tiên? Tại sao không sử dụng khóa Busines làm ID? Điều này giả định rằng nó không bao giờ thay đổi tất nhiên .. – bert

+0

Nó luôn luôn là đề nghị của nhóm ngủ đông từ những gì tôi đã đọc - và nó dường như làm việc tốt trong hầu hết các tình huống, ngoại trừ một trong những tôi đặt ra: s http: // community.jboss.org/wiki/EqualsandHashCode –

Trả lời

2

mã mà sẽ việc, nhưng thiết ID một cách rõ ràng trên thực thể tách ra không cần thiết. Ứng dụng Hibernate điển hình có phương thức 'lưu' xử lý hai trường hợp:

  1. Người dùng muốn tạo Người dùng mới, do đó ứng dụng sẽ tạo đối tượng Người dùng có 'null' làm ID.
  2. Người dùng được truy vấn cho một danh sách người dùng và đang chọn một danh sách để chỉnh sửa. Trong trường hợp này, ứng dụng thực hiện truy vấn và truyền đối tượng đến phương thức 'lưu'. Đối tượng sẽ có một ID và mã sẽ áp dụng các giá trị mới cho nó.

Có vẻ như nội dung nào đó trong mã của bạn không hoạt động trong trường hợp thứ hai theo cách thông thường. Nếu đối tượng 'người dùng' đến từ một số truy vấn Hibernate trước (được kích hoạt bởi người dùng nhấp vào 'chỉnh sửa người dùng' hoặc một cái gì đó tương tự), thì nó sẽ có một ID. Do đó, chỉ cần gọi số merge(user).

Tôi thường làm điều gì đó như thế này:

if (user.getId() == null) 
    em.persist(user); 
else 
    user = em.merge(user); 

Sau đó, tôi thêm mã để xử lý các vấn đề lạc quan khóa (một phiên cập nhật các đối tượng) và các vấn đề hạn chế duy nhất (phiên khác đã cố gắng để tồn tại một cái gì đó với phím kinh doanh cùng).

Các khung như Seam có thể làm điều này đơn giản hơn vì chúng truyền bá phiên Hibernate giữa các phương thức của trình điều khiển. Vì vậy, ngay cả 'hợp nhất' là không cần thiết.

+0

Có tương đương với 'hợp nhất' không điều kiện? Ngoài việc trả về một bản sao của đối tượng, 'merge' có thể làm mọi thứ' persist'. –

+0

IIRC, hợp nhất là một số siêu tồn tại. Tôi hầu như không sử dụng hợp nhất nữa kể từ khi tôi bắt đầu sử dụng Seam. –

0

Nếu thực thể của bạn là một thực thể tách rời, điều duy nhất bạn thực sự cần làm là gọi entityManager.merge (người dùng). Bạn không cần phải thực hiện bất kỳ phương pháp tìm. Nếu thực thể của bạn không bị tách rời mà là mới (không có id được chỉ định), bạn nên tìm thực thể thích hợp trong cơ sở dữ liệu trước khi thực hiện bất kỳ thao tác sửa đổi nào trên thực thể đó và hợp nhất nó sau đó. tức là:

User user = userDao.findBySomething(Criteria c); 

//stuff that modifies user 

user = userDao.merge(user); 
+0

Tôi đoán rằng vấn đề của tôi là trường hợp thứ 2 mà bạn đề cập đến. Trừ khi tôi đặt rõ ràng id trên cá thể mới của thực thể, quá trình hợp nhất không thành công. Điều này có ý nghĩa nếu cách duy nhất mà entityManager biết hợp nhất là sử dụng mã định danh, nhưng tôi đã nghĩ rằng nó được cho là phải hiểu .equals(). Nếu không, và tôi tiếp tục bằng cách thiết lập ID, tôi sẽ gặp phải bất kỳ sự cố nào khác không? –

+1

Phương thức equals() và hashCode() của bạn nên * không bao giờ * giả định rằng ID được đặt, chúng phải luôn sử dụng khóa doanh nghiệp. Vấn đề là bằng cách nào đó trường hợp tách rời không có một ID (làm cho nó * thoáng qua *, không tách ra). Xem câu trả lời của tôi ở trên. –

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