2009-06-03 33 views
5

Nhóm của tôi có hai lớp, UserStore, 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); 
+1

Bạn có thể thêm dòng mã nơi bạn thêm/sửa đổi Cửa hàng không? –

Trả lời

1

Vui lòng thử các chú thích sau trong đối tượng người dùng của bạn:

@ManyToMany(cascade = {CascadeType.ALL}) 
+0

Tôi sẽ dùng thử vào buổi sáng - mặc dù chúng tôi đã thêm @ManyToMany (cascade = {CascadeType.PERSIST, CascadeType.MERGE}) rồi. –

6

Vấn đề là bạn có một mối quan hệ hai chiều, và trong trường hợp này có một thực thể mà bên kia kiểm soát, và từ việc lập bản đồ của bạn kiểm soát một là Cửa hàng thực thể chứ không phải là Người dùng, vì vậy việc thêm người dùng vào cửa hàng sẽ hoạt động (vì Cửa hàng là người kiểm soát) nhưng thêm cửa hàng cho người dùng sẽ không.

hãy thử đảo ngược tình huống bằng cách đặt đối tượng người dùng điều khiển quan hệ bằng cách đặt chú thích @ManyToMany (mappedBy = "users") vào phương thức getStores() và thay đổi getUsers().

Hy vọng điều đó sẽ hữu ích.

P.S. thực thể kiểm soát quan hệ luôn là một đối tượng không có thuộc tính mappedBy.

2

Tôi chỉ gặp sự cố tương tự và tìm giải pháp trên một trang khác.

Đây là những gì đã làm việc cho tôi

gọi getJpaTemplate(). Flush() trước khi hợp nhất gọi đã hoạt động đối với tôi.

Tôi không hiểu lý do tại sao nó hoạt động.

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