Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 休眠@ManyToMany save_Spring_Hibernate_Orm_Hibernate Annotations - Fatal编程技术网

Spring 休眠@ManyToMany save

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 = {

在我的代码中,两个表(用户和工作)之间有@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;
...
编辑

我通过手动执行来解决问题, 但我仍然在寻找最好的解决方案 :(


每次向数据库中已存在的用户添加工作时,都会创建一个新用户(尽管该用户已存在),为其分配一组包含单个元素的作品,然后使用新的作品更新现有用户。当然,结果是现有作品集被包含单个元素的新作品集替换

您不应该创建新用户,因为它已存在于数据库中。相反,请从数据库中获取现有用户,并将新工作添加到他的工作集中:

// 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