2016-07-05 16 views
5

Mặc dù có thể là một câu hỏi tầm thường, tôi luôn tự hỏi về điều này.DAO/kho lưu trữ: Giá trị trả lại thực tế tốt sau khi chèn/cập nhật

Thông thường, sau khi chèn vào db, có vẻ thực tế phổ biến để trả lại id của pháp nhân kinh doanh.

@Override 
public Long createUser(UserEntity user) { 
    em.merge(user); 
    em.flush(); 

    return user.getId(); 
} 

Có lý do thuyết phục để trả lại id thay vì tham chiếu đối tượng doanh nghiệp không?

Tương tự, tôi đã thấy update trả lại void, trong khi đó cũng có thể là id/Người dùng.

Nếu tôi đã viết DAO/Repository để người khác sử dụng, giá trị trả lại được thông báo (nếu có) là gì và tại sao?

+2

hợp nhất rời khỏi thực thể được truyền tách ra, sao chép trạng thái đó thành một thực thể được quản lý và trả về thực thể được quản lý. Trả lại ID là vô dụng: người gọi đã biết nó vì nó đã truyền nó trong thực thể. Những gì người gọi cần là thực thể được quản lý được tạo hoặc cập nhật. –

+0

@JBNizet Cảm ơn điều đó có ý nghĩa. – Trace

+0

Đúng, trọng tâm là ở đây trên thực tế là lệnh hợp nhất trả về đối tượng thực thể đã hợp nhất. Theo tôi thì đó là cách thực hành tốt nhất. Chỉ cần trả về đối tượng UserEntity được trả về bởi lệnh merge. Lý do cho điều này là nó thường là một thực hành tốt không phải để thay đổi một đối tượng thông qua như một tham số. Vì vậy, bạn có lẽ nên mong đợi phương pháp hợp nhất không thay đổi đối tượng được truyền. Và luôn luôn trở về cùng một đối tượng không thay đổi gì (hoặc một phần của nó), đã được truyền cho phương pháp của bạn có thể không có mục đích. – Frank

Trả lời

3

Tại sao không trả về toàn bộ cá thể nếu nó đã được tạo/cập nhật thành công? Điều tương tự những gì mùa xuân liệu làm,

<S extends T> S save(S entity); 
<S extends T> Iterable<S> save(Iterable<S> entities); 
  1. đã Tôi phải làm gì nếu tôi cần một phần khác của tạo/đối tượng được cập nhật, trừ id? (name, date cho một thực thể User).

  2. Tại sao id trả lại nếu có một vài trường mô tả chính xác một thể hiện (khóa chính kết hợp)?

Không có khó khăn để trả lại toàn bộ đối tượng (không có gì là "phí" ở đây như được đề cập bởi @Danny Fonk), nhưng nó có thể tiết kiệm nhiều thời gian của bạn trong tương lai.

1

Theo kinh nghiệm của tôi, quá trình chèn trả lại id cho thực thể kinh doanh là thực hành tốt vì id đó có thể được sử dụng đầy đủ để tiếp tục quá trình kinh doanh vì nó mới được ghi lại, hơn nữa cho quá trình cập nhật mà chúng tôi tìm nạp thực thể trước khi chúng tôi cập nhật hồ sơ để có nghĩa là chúng tôi đã có id, vì vậy không cần phải trả lại id

+0

Có, nhưng liên quan đến việc chèn, do đó, không trả lại đối tượng kinh doanh ref nếu id được thiết lập trước khi trở về. Đồng ý cho phần cập nhật! – Trace

1

Tôi cũng nghĩ rằng việc trả lại ID nói chung là tốt nếu không thực hiện tốt nhất. Hoặc bạn cũng có thể trả lại toàn bộ đối tượng nhưng điều này là kinda "overhead" nếu bạn không cần phải làm việc với nó nữa sau khi tạo.

Khi cập nhật/thay đổi đối tượng trong cơ sở dữ liệu, chúng tôi luôn trả về đối tượng hoặc có khả năng nhất là bản cập nhật thành công hoặc không vì chúng tôi đã có đối tượng.

1

Nếu bạn quay trở lại đơn vị, mã khách hàng sẽ trông như thế này:

MyEntity e = ...; 
MyEntity created = dao.create(e); 

nhưng "e" và "tạo ra" là cùng một đối tượng. Điều này có thể dẫn đến sự nhầm lẫn. Bạn có thể tranh luận rằng bạn có thể trong tương lai thay đổi việc thực hiện Phương thức tạo của bạn để nó thực sự trả về một thực thể khác. Tôi đã nhìn thấy điều này. Tôi không thích nó. Đó là một thiết kế dai dẳng khủng khiếp.

Hiện tại có một tình huống mà tôi cho rằng việc trả lại id là một tùy chọn tốt: Nếu bạn có ranh giới giao dịch (REQUIRES_NEW) xung quanh Phương thức tạo của mình. Việc chuyển các id thay vì các thực thể thông qua các ranh giới giao dịch không phải là một điều xấu.

+0

Không chắc chắn lý do tại sao điều này xảy ra. Bạn chỉ có thể tham khảo thực thể được trả về với thực thể ban đầu ... Bây giờ tôi nghĩ về nó, tôi giả sử bạn thậm chí có thể trả về void (mặc dù điều đó không rõ ràng), vì những gì được thông qua là một bản sao của tham chiếu và đặt id trong dao. – Trace

+0

, tất nhiên bạn có thể làm e = dao.create (e); nhưng tại sao? – EasterBunnyBugSmasher

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