0

次のように、コード内の 2 つのテーブル (ユーザーと作業) の間に @ManyToMany 関係があります。

...
public class User implements Serializable{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name = "USER_WORK", joinColumns = { 
    @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { 
        @JoinColumn(name = "WORK_ID") 
})  
@Cascade({CascadeType.ALL})
private Set<Work> works;
...

そして、新しい作業をユーザーに影響を与えたい場合は、次のコードを実行します。

    ...
addWorkToUser(Work work,Integer idUser){ 
    User user = new User();
   user.setId(idUser);
   Set<Work> worksList = new HashSet<Work>();
   worksList.add(work);
   user.setWorks(worksList);
       getHibernateTemplate().saveOrUpdate(User)
}
    ...

問題は、私が初めて新しい作品に影響を与えるとき、すべてがうまくいくことです。しかし、同じユーザーに新しい中華鍋に影響を与えると、最後の作業しか表示されません!!! コードをデバッグすると、削除クエリが見つかりました。この削除クエリをスキップするにはどうすればよいですか?

Hibernate: update User set name=? where id=?
Hibernate: delete from USER_WORK where USER_ID=?
Hibernate: insert into USER_WORK (USER_ID, WORK_ID) values (?, ?)

編集

私はそれを手動で実行することで問題を回避しますが、私はまだ最善の解決策を探しています:(

    User User = (User) DataAccessUtils
            .singleResult((getHibernateTemplate().find(
                    "From User WHERE id = ?", idUser)));
    User.getWorks().add(work);
    getHibernateTemplate().saveOrUpdate(User);
4

1 に答える 1