SSH、hibernate 删除方法、级联删除问题。(急)

时间:2021-12-13 22:09:15
数据库有两张表 cost表 和 user 表:

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


引用 1 楼 wnf2009 的回复:
代码好像没错 能贴一下报错信息么


没有报错信息耶。主要就是删除一个用户对应多条收支信息。但是删除一条收支信息,这个用户也会被删除。
所以显示的时候就有问题了。

#4


引用 2 楼 hao_wen123 的回复:
多对一的特殊情况啊,不是很了解,应该是没设置主控方 (inverse)


初学SSH 框架 不是很了解呐。 inverse 一开始在set上有加过。 不管设为true还是false 都是一样的呐。

#5


这个 不是很  清楚

#6


在实体类上加关联关系的时候,有一个注解是cascade
@cascade()好像是这个,把他的设置成cascadeType.REFRESH其他不要,这样试试

#7


在Cost这个实体的对应映射文件里配置cascade=false,就不会级联删除了。


欢迎加入java爱好者群:46918907

#8


引用 7 楼 cq2gl 的回复:
在Cost这个实体的对应映射文件里配置cascade=false,就不会级联删除了。


欢迎加入java爱好者群:46918907


我试过了耶。不管是设置成 true 还是 false 都是一样。所以后来被我删了哈

#9


引用 8 楼 jmonian 的回复:
引用 7 楼 cq2gl 的回复:
在Cost这个实体的对应映射文件里配置cascade=false,就不会级联删除了。


欢迎加入java爱好者群:46918907


我试过了耶。不管是设置成 true 还是 false 都是一样。所以后来被我删了哈


cascade=false 这样的话。项目发布的时候就会报错了。。。 

#10


你的两个表之间的关联关系弄错了吧 
一个用户有多个收支情况
User.hbm.xml:
里面应该是 <set>...</set>
Cost.hbm.xml:
里面应该是<many-to-one>...<many-to-one>
这样你删一个cost应该就没事了

cascade的取值好像是 none,all,save-update,delete

#11


引用 10 楼 qiang0322 的回复:
你的两个表之间的关联关系弄错了吧 
一个用户有多个收支情况
User.hbm.xml:
里面应该是 <set>...</set>
Cost.hbm.xml:
里面应该是<many-to-one>...<many-to-one>
这样你删一个cost应该就没事了

cascade的取值好像是 none,all,save-update,delete


我之前是对的。但是之前那样设置 我查询全部收支的时候不能查出相应的用户信息。所以改反了。但是这样就出现这个问题。我现在呢就想取消级联删除!

#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



#14


首先将外键关系的维护交给多方,cascade=true.
在删除的时候想只删除当前的cost信息,传入cost对象,但在之前还有一个删除cost与user对象之间的关系的动作set.remove(cost).将当前的cost对象从集合对象中移除掉。
再来执行删除应该就会成功了吧.

#15


首先你的映射关系搞浑了、应该是一个user对应多个cost(many-to-one),然后将casecade设为false,这样应该就没问题了吧

#1


代码好像没错  能贴一下报错信息么

#2


多对一的特殊情况啊,不是很了解,应该是没设置主控方 (inverse)

#3


引用 1 楼 wnf2009 的回复:
代码好像没错 能贴一下报错信息么


没有报错信息耶。主要就是删除一个用户对应多条收支信息。但是删除一条收支信息,这个用户也会被删除。
所以显示的时候就有问题了。

#4


引用 2 楼 hao_wen123 的回复:
多对一的特殊情况啊,不是很了解,应该是没设置主控方 (inverse)


初学SSH 框架 不是很了解呐。 inverse 一开始在set上有加过。 不管设为true还是false 都是一样的呐。

#5


这个 不是很  清楚

#6


在实体类上加关联关系的时候,有一个注解是cascade
@cascade()好像是这个,把他的设置成cascadeType.REFRESH其他不要,这样试试

#7


在Cost这个实体的对应映射文件里配置cascade=false,就不会级联删除了。


欢迎加入java爱好者群:46918907

#8


引用 7 楼 cq2gl 的回复:
在Cost这个实体的对应映射文件里配置cascade=false,就不会级联删除了。


欢迎加入java爱好者群:46918907


我试过了耶。不管是设置成 true 还是 false 都是一样。所以后来被我删了哈

#9


引用 8 楼 jmonian 的回复:
引用 7 楼 cq2gl 的回复:
在Cost这个实体的对应映射文件里配置cascade=false,就不会级联删除了。


欢迎加入java爱好者群:46918907


我试过了耶。不管是设置成 true 还是 false 都是一样。所以后来被我删了哈


cascade=false 这样的话。项目发布的时候就会报错了。。。 

#10


你的两个表之间的关联关系弄错了吧 
一个用户有多个收支情况
User.hbm.xml:
里面应该是 <set>...</set>
Cost.hbm.xml:
里面应该是<many-to-one>...<many-to-one>
这样你删一个cost应该就没事了

cascade的取值好像是 none,all,save-update,delete

#11


引用 10 楼 qiang0322 的回复:
你的两个表之间的关联关系弄错了吧 
一个用户有多个收支情况
User.hbm.xml:
里面应该是 <set>...</set>
Cost.hbm.xml:
里面应该是<many-to-one>...<many-to-one>
这样你删一个cost应该就没事了

cascade的取值好像是 none,all,save-update,delete


我之前是对的。但是之前那样设置 我查询全部收支的时候不能查出相应的用户信息。所以改反了。但是这样就出现这个问题。我现在呢就想取消级联删除!

#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



#14


首先将外键关系的维护交给多方,cascade=true.
在删除的时候想只删除当前的cost信息,传入cost对象,但在之前还有一个删除cost与user对象之间的关系的动作set.remove(cost).将当前的cost对象从集合对象中移除掉。
再来执行删除应该就会成功了吧.

#15


首先你的映射关系搞浑了、应该是一个user对应多个cost(many-to-one),然后将casecade设为false,这样应该就没问题了吧