hibernate 一对多 更新时不生成多条记录

fjhooo 2010-02-24 10:23:24
如题

例如用户(User)和资源(Resource)两个对象

从使用的角度来说,资源(Resource)是一方,用户(User)是多方,
User.java

* 资源跟 资源共享的人 一对多关系
**/
@ManyToOne
private Resource usingRes;



Resource.java

@OneToMany(targetEntity = User.class)
@JoinColumn(name = "resource_id")
@Cascade(value = CascadeType.SAVE_UPDATE)
@OrderBy("id")
private Set<User> users = new HashSet<User>(0);


往单个资源中设置它的使用者时使用的方法代码:

if (this.getUsername() == null || this.getUsername().equals("")) {

} else {
for (int i = 0; i < username.length; i++) {

List<User> uls = service.findListByParam("from User u where u.name = ? ", this.getUsername()[i]);

for (User u : uls) {
r.getUsers().add(u);
}
service.update(r);
}
}





现在问题是,有 X,Y 两个资源,A,B两个用户

先为X设置A,B两个个使用者,再为Y设置两个使用者

那么在使用者(User)表里并不会像预期的那样生成多2条记录

查看hibernate发出的sql语句,看到每次只是执行了update相应user表里user的usingRes字段。

还求好心人解答。可以多给分。
...全文
306 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
nevernam 2010-03-01
  • 打赏
  • 举报
回复
增加的时候操纵多方即可解决

按照LZ的例子,应该new一个user,通过属性复制复制除了Resource属性和id主键属性之外的其他所有字段

然后setResource(r),save(User)即可
archko 2010-02-24
  • 打赏
  • 举报
回复
for (User u : uls) {
r.getUsers().add(u);
}
service.update(r);
我想问题出在这里了.这个R先问下是什么东西,当前没有给出,就按我的想法了.
假设R是Resource,而且是在循环外面定义的.
这样不是每次都更新么?循环一次,更新一次R.因为你两次添加的用户都一样.
你可以设置下,循环,让每次添加的用户都不一样,最后只会更新循环最后的值
zhoubaoyi 2010-02-24
  • 打赏
  • 举报
回复
我也遇到相同的问题!急切关注当中
BearKin 2010-02-24
  • 打赏
  • 举报
回复
引用 4 楼 nickycheng 的回复:
我想应该是在@ManyToOne中设置级联关系吧

<many-to-one
  cascade="save-update"
/>

注解方式不太熟

@OneToMany(targetEntity = User.class,cascade = CascadeType.ALL)

后面那个CascadeType是枚举 可以选择其他的级联关系
nickycheng 2010-02-24
  • 打赏
  • 举报
回复
我想应该是在@ManyToOne中设置级联关系吧

<many-to-one
cascade="save-update"
/>

注解方式不太熟
jaguar_yang 2010-02-24
  • 打赏
  • 举报
回复
猜想你设置y资源的时候,Hibernate任务是update,而不是save了,你不用他的saveorupdate,直接用save看看,或者设置y时的方法要换一下,应该构建新的user对象,就可以save了。
fjhooo 2010-02-24
  • 打赏
  • 举报
回复
引用 1 楼 xys_777 的回复:
hibernate还不熟,是不是要用savaorupdate


saveorupate根据取得的对象有无主键去判断执行save或者update方法

曾经使用属性复制的方法通过update成功添加新的记录,但是感觉不实用,以为很多非基本类型的属性

比如set什么的,就无法复制,要做判断手动循环去赋值。量一大,代码就很繁复 。
永生天地 2010-02-24
  • 打赏
  • 举报
回复
hibernate还不熟,是不是要用savaorupdate
重返春季 2010-02-24
  • 打赏
  • 举报
回复
不是很懂,还是帮楼主顶一下,希望高手参与。
中国匠心 2010-02-24
  • 打赏
  • 举报
回复
配置文件里加 cascade="all"
colin_pxx 2010-02-24
  • 打赏
  • 举报
回复
你用的是update不是insert当然只会更新数据不会多出来2条数据啊
Y_2716 2010-02-24
  • 打赏
  • 举报
回复
感觉是表之间的关系没设置好,没实现级联
keven_2008 2010-02-24
  • 打赏
  • 举报
回复
楼主的数据库有问题吧?
资源表(以下简称r)和user表(简称u)之间的关系是多对多的联系.
一般情况下是新建一个中间表(r-u联系表),将其转化为两个一对多的关系.

另外你这写法有些颠倒,一般是更新建一个user对象,为其设置resource_id,然后save(saveOrUpdate)到数据库中.你现在这样为r加了一个u没错,但级联更新时u是存在于数据库中的,因为要保证此条记录唯一,那么将改原来user中的resource_id属性,于是就变成了更新了.
keven_2008 2010-02-24
  • 打赏
  • 举报
回复
设置级联更新不就可以了?

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧