2010-11-17 30 views

Trả lời

2

Nó sẽ hoạt động nhưng tốt nhất nếu bạn thể hiện ý định của mình (nhân bản) trong chế độ miền của bạn. Thiết lập một trường thành null chỉ là một chi tiết thực hiện và không mang ý nghĩa gì cả.

Address address = AddressDAO.get(id); 
Address clone = address.cloneMe(); 
AddressDAO.add(clone); 
+1

Vấn đề tôi thấy với điều đó là nếu address.cloneMe() chỉ đặt id để null, tên phương pháp là một lời nói dối. Việc tự gọi nó không tạo ra bản sao, nó vẫn là cùng một đối tượng. – waxwing

+0

Đó là một phương pháp sao chép. Đối tượng gốc không bị ảnh hưởng. Nó trả về một cá thể mới. Bạn có thể diễn tả nó như là một nhà xây dựng bản sao, nhưng tôi thích sự biểu cảm của một phương pháp (được đặt tên) cho điều đó. – cherouvim

5

Vâng, đó là nên làm việc. Tôi không chắc liệu hibernate không kiểm tra các tham chiếu đối tượng, vì vậy nếu điều này không hoạt động, bạn có thể cần phải tạo một cá thể mới và sao chép tất cả các thuộc tính (sử dụng BeanUtils.copyProperties, hoặc thậm chí BeanUtils.cloneBean(..)), và sau đó thiết lập ID thành null/0.

1

Tôi khuyên bạn nên dùng thử. Nếu adress vẫn còn liên tục (Phiên ràng buộc), tôi sẽ giả định rằng sẽ có vấn đề. Bạn có thể cần session.evict(address) trước khi đặt id thành rỗng.

0

Điều này sẽ không tạo bản sao sâu ... do đó bản sao của bạn sẽ đề cập đến các đối tượng trẻ em của vật thể gốc.

2

Sử dụng trên tầng thác Gỡ bỏ đối tượng đó trong chế độ ngủ đông.

sau đó

Address address = AddressDAO.get(id); 
AddressDAO.evict(address); //Internally session.evict(address); 
address.setId(null); // If id is autogenerated 
AddressDAO.add(address); 
Các vấn đề liên quan