Spring 休眠@ManyToMany save
在我的代码中,两个表(用户和工作)之间有@ManyToMany关系,如下所示:Spring 休眠@ManyToMany save,spring,hibernate,orm,hibernate-annotations,Spring,Hibernate,Orm,Hibernate Annotations,在我的代码中,两个表(用户和工作)之间有@ManyToMany关系,如下所示: ... public class User implements Serializable{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @ManyToMany(fetch=FetchType.EAGER) @JoinTable(name = "USER_WORK", joinColumns = {
...
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;
...
编辑:
我通过手动执行来解决问题,
但我仍然在寻找最好的解决方案
:(
每次向数据库中已存在的用户添加工作时,都会创建一个新用户(尽管该用户已存在),为其分配一组包含单个元素的作品,然后使用新的作品更新现有用户。当然,结果是现有作品集被包含单个元素的新作品集替换 您不应该创建新用户,因为它已存在于数据库中。相反,请从数据库中获取现有用户,并将新工作添加到他的工作集中:
// if the work isn't persistent yet:
session.persist(work);
User user = (User) session.get(User.class, idUser);
user.addWork(work);
// nothing else needed
我将代码更改为:Session Session=getHibernateTemplate().getSessionFactory().getCurrentSession();Session.beginTransaction();User User=(用户)Session.get(用户类,idUser);Set groupsList=new HashSet();groupsList.add(组);User.setGroups(组列表);getHibernateTemplate().saveOrUpdate(用户);Session.close();但我仍然有相同的问题,因为您仍然使用包含单个工作的新工作集替换该工作集。您必须将该工作添加到用户拥有的工作集。而不是使用新工作集替换该工作集。
user.getGroups().add(工作)
。当您向钱包中添加硬币时,您不会构造一个新钱包,将硬币放入新钱包中,然后用新钱包替换口袋中的钱包。您将现有钱包(已经包含硬币)放入口袋中,然后将新硬币添加到钱包中。此处相同。我尝试了,但它对我无效。我尝试使用流动功能:public void addWorkToUser(Work-Work,整数idUser){Session Session=getHibernateTemplate().getSessionFactory().getCurrentSession();Session.beginTransaction();User-User=(用户)Session.get(用户)Session.GetOrUpdate(工作);User.getGroups().add(工作);Session.saveOrUpdate(用户);Session.flush();session.close();}什么不起作用?为什么要对连接的用户调用saveOrUpdate()?我在回答中调用了吗?没有,我明确地补充道:“不需要其他东西”。
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);
// if the work isn't persistent yet:
session.persist(work);
User user = (User) session.get(User.class, idUser);
user.addWork(work);
// nothing else needed