cost 中有外键 userid 于user 中的id对应. cost里是用户的收支情况。user是用户信息
一个用户有多条收支信息。
问题是:
我删除一条收支信息。对应着的该用户也被删了。而该用户所在的另外收支信息还在、这样显示的时候就报错了。
我在mySql里用delect语句 删除一条cost表中的信息 对应着user表中的一条信息也会被删除、。
怎么样可以实现只删收支不删用户???
User.hbm.xml:
<many-to-one name="cost" class="financesj.center.dao.entity.Cost" update="false" insert="false" fetch="select" >
<column name="Id" not-null="true" unique="true" />
</many-to-one>
Cost.hbm.xml:
<set name="users" cascade="save-update" >
<key>
<column name="Id" not-null="true" unique="true" />
</key>
<one-to-many class="financesj.center.dao.entity.User" />
</set>
不知道跟这两个有么有关系。一起贴上来。
还有我的删除:
public void deleteCost(Integer id){
Cost co = costDAO.findById(id);
costDAO.delete(co);
}
删除方法:
public void delete(Cost instance) {
log.debug("deleting Cost instance");
try {
getHibernateTemplate().delete(instance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}
15 个解决方案
#1
代码好像没错 能贴一下报错信息么
#2
多对一的特殊情况啊,不是很了解,应该是没设置主控方 (inverse)
#3
没有报错信息耶。主要就是删除一个用户对应多条收支信息。但是删除一条收支信息,这个用户也会被删除。
所以显示的时候就有问题了。
#4
初学SSH 框架 不是很了解呐。 inverse 一开始在set上有加过。 不管设为true还是false 都是一样的呐。
#5
这个 不是很 清楚
#6
在实体类上加关联关系的时候,有一个注解是cascade
@cascade()好像是这个,把他的设置成cascadeType.REFRESH其他不要,这样试试
@cascade()好像是这个,把他的设置成cascadeType.REFRESH其他不要,这样试试
#7
在Cost这个实体的对应映射文件里配置cascade=false,就不会级联删除了。
欢迎加入java爱好者群:46918907
欢迎加入java爱好者群:46918907
#8
我试过了耶。不管是设置成 true 还是 false 都是一样。所以后来被我删了哈
#9
cascade=false 这样的话。项目发布的时候就会报错了。。。
#10
你的两个表之间的关联关系弄错了吧
一个用户有多个收支情况
User.hbm.xml:
里面应该是 <set>...</set>
Cost.hbm.xml:
里面应该是<many-to-one>...<many-to-one>
这样你删一个cost应该就没事了
cascade的取值好像是 none,all,save-update,delete
一个用户有多个收支情况
User.hbm.xml:
里面应该是 <set>...</set>
Cost.hbm.xml:
里面应该是<many-to-one>...<many-to-one>
这样你删一个cost应该就没事了
cascade的取值好像是 none,all,save-update,delete
#11
我之前是对的。但是之前那样设置 我查询全部收支的时候不能查出相应的用户信息。所以改反了。但是这样就出现这个问题。我现在呢就想取消级联删除!
#12
关联配置有错,用户应该先得到,
而不是反过来关连用户
你这样当然只能够把用户删掉
其他的都还在
而不是反过来关连用户
你这样当然只能够把用户删掉
其他的都还在
#13
楼主的映射关系都写错了
User.hbm.xml:
<many-to-one name="cost" class="financesj.center.dao.entity.Cost" update="false" insert="false" fetch="select" >
<column name="Id" not-null="true" unique="true" />
</many-to-one>
User这端相对于Cost是一对多的关系,应该用one-to-many
Cost.hbm.xml:
<set name="users" cascade="save-update" >
<key>
<column name="Id" not-null="true" unique="true" />
</key>
<one-to-many class="financesj.center.dao.entity.User" />
</set>
Cost这一端相对于User,多对一的关系,应该用many-to-one
User.hbm.xml:
<many-to-one name="cost" class="financesj.center.dao.entity.Cost" update="false" insert="false" fetch="select" >
<column name="Id" not-null="true" unique="true" />
</many-to-one>
User这端相对于Cost是一对多的关系,应该用one-to-many
Cost.hbm.xml:
<set name="users" cascade="save-update" >
<key>
<column name="Id" not-null="true" unique="true" />
</key>
<one-to-many class="financesj.center.dao.entity.User" />
</set>
Cost这一端相对于User,多对一的关系,应该用many-to-one
#14
首先将外键关系的维护交给多方,cascade=true.
在删除的时候想只删除当前的cost信息,传入cost对象,但在之前还有一个删除cost与user对象之间的关系的动作set.remove(cost).将当前的cost对象从集合对象中移除掉。
再来执行删除应该就会成功了吧.
在删除的时候想只删除当前的cost信息,传入cost对象,但在之前还有一个删除cost与user对象之间的关系的动作set.remove(cost).将当前的cost对象从集合对象中移除掉。
再来执行删除应该就会成功了吧.
#15
首先你的映射关系搞浑了、应该是一个user对应多个cost(many-to-one),然后将casecade设为false,这样应该就没问题了吧
#1
代码好像没错 能贴一下报错信息么
#2
多对一的特殊情况啊,不是很了解,应该是没设置主控方 (inverse)
#3
没有报错信息耶。主要就是删除一个用户对应多条收支信息。但是删除一条收支信息,这个用户也会被删除。
所以显示的时候就有问题了。
#4
初学SSH 框架 不是很了解呐。 inverse 一开始在set上有加过。 不管设为true还是false 都是一样的呐。
#5
这个 不是很 清楚
#6
在实体类上加关联关系的时候,有一个注解是cascade
@cascade()好像是这个,把他的设置成cascadeType.REFRESH其他不要,这样试试
@cascade()好像是这个,把他的设置成cascadeType.REFRESH其他不要,这样试试
#7
在Cost这个实体的对应映射文件里配置cascade=false,就不会级联删除了。
欢迎加入java爱好者群:46918907
欢迎加入java爱好者群:46918907
#8
我试过了耶。不管是设置成 true 还是 false 都是一样。所以后来被我删了哈
#9
cascade=false 这样的话。项目发布的时候就会报错了。。。
#10
你的两个表之间的关联关系弄错了吧
一个用户有多个收支情况
User.hbm.xml:
里面应该是 <set>...</set>
Cost.hbm.xml:
里面应该是<many-to-one>...<many-to-one>
这样你删一个cost应该就没事了
cascade的取值好像是 none,all,save-update,delete
一个用户有多个收支情况
User.hbm.xml:
里面应该是 <set>...</set>
Cost.hbm.xml:
里面应该是<many-to-one>...<many-to-one>
这样你删一个cost应该就没事了
cascade的取值好像是 none,all,save-update,delete
#11
我之前是对的。但是之前那样设置 我查询全部收支的时候不能查出相应的用户信息。所以改反了。但是这样就出现这个问题。我现在呢就想取消级联删除!
#12
关联配置有错,用户应该先得到,
而不是反过来关连用户
你这样当然只能够把用户删掉
其他的都还在
而不是反过来关连用户
你这样当然只能够把用户删掉
其他的都还在
#13
楼主的映射关系都写错了
User.hbm.xml:
<many-to-one name="cost" class="financesj.center.dao.entity.Cost" update="false" insert="false" fetch="select" >
<column name="Id" not-null="true" unique="true" />
</many-to-one>
User这端相对于Cost是一对多的关系,应该用one-to-many
Cost.hbm.xml:
<set name="users" cascade="save-update" >
<key>
<column name="Id" not-null="true" unique="true" />
</key>
<one-to-many class="financesj.center.dao.entity.User" />
</set>
Cost这一端相对于User,多对一的关系,应该用many-to-one
User.hbm.xml:
<many-to-one name="cost" class="financesj.center.dao.entity.Cost" update="false" insert="false" fetch="select" >
<column name="Id" not-null="true" unique="true" />
</many-to-one>
User这端相对于Cost是一对多的关系,应该用one-to-many
Cost.hbm.xml:
<set name="users" cascade="save-update" >
<key>
<column name="Id" not-null="true" unique="true" />
</key>
<one-to-many class="financesj.center.dao.entity.User" />
</set>
Cost这一端相对于User,多对一的关系,应该用many-to-one
#14
首先将外键关系的维护交给多方,cascade=true.
在删除的时候想只删除当前的cost信息,传入cost对象,但在之前还有一个删除cost与user对象之间的关系的动作set.remove(cost).将当前的cost对象从集合对象中移除掉。
再来执行删除应该就会成功了吧.
在删除的时候想只删除当前的cost信息,传入cost对象,但在之前还有一个删除cost与user对象之间的关系的动作set.remove(cost).将当前的cost对象从集合对象中移除掉。
再来执行删除应该就会成功了吧.
#15
首先你的映射关系搞浑了、应该是一个user对应多个cost(many-to-one),然后将casecade设为false,这样应该就没问题了吧