次のように、コード内の 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);