Nhóm của tôi có hai lớp, User
và Store
, có liên quan bằng chú thích JPA @ManyToMany
. Mã có liên quan dưới đây.JPA @ManyToMany Viết trên Tạo nhưng Không Cập nhật
Khi tạo đối tượng User
mới và đặt cửa hàng, cuộc sống là tốt. Nhưng chúng ta đang thấy một số hành vi không mong muốn khi cố cập nhật các đối tượng User thông qua giao diện người dùng web Struts 2/Spring của chúng ta. (Những vấn đề này không xảy ra khi chạy thử nghiệm tích hợp tự động đơn giản thông qua JUnit).
Đơn giản chỉ cần đặt, khi lưu User
, bộ sưu tập của cửa hàng không được cập nhật - cơ sở dữ liệu không có thay đổi và tải lại đối tượng User
được đề cập cho thấy nó có bộ cửa hàng không thay đổi.
Giải pháp duy nhất chúng tôi đã tìm thấy vấn đề này - và chúng tôi không thích giải pháp này, nó làm cho tất cả các nhà phát triển trong nhóm của chúng tôi hơi lo lắng - là tạo một Set
mới của Store
s, sau đó làm user.setStores(null)
, sau đó thực hiện user.setStores(stores)
.
Chúng tôi đang sử dụng OpenEntityManagerInViewFilter
; chúng tôi đang sử dụng Hibernate làm nhà cung cấp JPA của chúng tôi; chúng tôi đang sử dụng JpaTransactionManager của Spring. Chúng tôi không có bất kỳ chú thích @Transactional
nào trong mã của chúng tôi - và việc thêm chúng sẽ phá vỡ mã hiện tại do hành vi proxy được mô tả ở nơi khác.
Bất kỳ thông tin chi tiết nào mà bất kỳ ai cũng có thể cung cấp về cách chúng tôi có thể giải quyết vấn đề này theo cách không thoải mái đều được hoan nghênh.
phần có liên quan của User.java:
@ManyToMany
@JoinTable(name = "company.user_store_access",
joinColumns = @JoinColumn(name = "userid"),
inverseJoinColumns = @JoinColumn(name = "storeid"))
public Set<Store> getStores() {
return stores;
}
phần có liên quan của Store.java:
phần@ManyToMany(mappedBy = "stores")
public List<User> getUsers() {
return users;
}
liên quan của UserDetailAction.java: (chuyển dịch sang người xuống một lớp hoặc hai, và sau đó :)
entity = getEntityManager().merge(entity);
Bạn có thể thêm dòng mã nơi bạn thêm/sửa đổi Cửa hàng không? –