iteye_15788 2010-04-03 19:39
浏览 231
已采纳

求hibernate 一对多级联删除问题,望赐教

DUser表为1,DCompany 为多,DCompany 中的@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)不能删除,应为需要保存DCompany 时,同时也级联保存DUser信息,现在的问题的,我想删除DUser,可以报错 deleted object would be re-saved by cascade (remove deleted object from,删除失败,该如何处理呢,谢谢了,还有一个问题就是一个网友告诉我一对多一般都是set,即如下

/**

* 用户信息

*/

@OneToMany(cascade=CascadeType.ALL,fetch = FetchType.LAZY)

@JoinColumn(name = "comId")

private Set users = new HashSet();

我用的是list,请问有什么说道吗,谢谢

删除代码为:

[code="java"]
@Test
public void del() {
DUser user = userService.findById("4028805527c3648d0127c36490560002");
System.out.println(user.getUserName());
userService.remove(user);
}
[/code]
[code="java"]
public class DUser extends BaseEntity {

/**
 * 
 */
private static final long serialVersionUID = -7733922431721279323L;
/**
 * 用户标识
 */
@Id
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
private String userId;
/**
 * 姓名
 */
private String userName;
/**
 * 所属公司信息
 */
@ManyToOne (cascade = CascadeType.ALL)  
@JoinColumn(name = "comId")
private DCompany company;
/**
 * 性别标识M.男F.女
 */
private String userSex;
/**
 * 密码
 */
private String userPass;
/**
 * Email
 */
private String userEmail;
/**
 * 电话
 */
private String userTel;
/**
 * qq
 */
private String userQq;
/**
 * 是否冻结 0冻结 1正常
 */
private Integer userEnable;
/**
 * 创建时间
 */
private Timestamp userCreateDate;

[/code]

[code="java"]public class DCompany extends BaseEntity {

/**
 * 
 */
private static final long serialVersionUID = 2472916124848152035L;

/**
 * 公司标识
 */
@Id
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
private String comId;
/**
 * 公司名称
 */
private String comName;
/**
 * 用户信息
 */
@OneToMany(mappedBy = "company", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "comId")
private List<DUser> users;
/**
 * 商品信息
 */
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "comId")
private List<DGoods> goods;
/**
 * 公司地址
 */
private String comAddress;
/**
 * 公司经营类别
 */
private String comType;
/**
 * 公司简介
 */
private String comIntro;
/**
 * 公司电话
 */
private String comTel;
/**
 * 增加时间
 */
private String comCreateDate;[/code]

我现在这么弄的
DUser user = userService.findById("4028805527c3648d0127c36490560002");
user.setCompany(null);
userService.remove(user);

可以删除了,不是是不是最理想的状态,另外在问下

删除user信息的时候是先根据id查出DUser对象,然后在删除DUser对象
这样在数据库中就导致了生成两条sql语句
1.select * from user where id ...
2.delete from user where id ....

这样会不会影响效率呢,如果直接用hql删除会不会更好些

另外 DUser user = userService.findById("4028805527c3648d0127c36490560002");

findById的时候是用load好呢还是get好呢,谢谢了,在次感谢

  • 写回答

3条回答 默认 最新

  • iteye_8776 2010-04-09 13:28
    关注

    补充一句:我只知道删除的时候必须先删除关联,才能删除一的那一方,而用set貌似比list好一些,具体我忘记了!一般我也只用set,list貌似只用了一次就是多对多的时候,瞎用的,呵呵!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 商城生产日期批次库存问题
  • ¥15 esp8266控制共阳极wrgb灯板无法关闭所有led灯
  • ¥100 python读取速度问题
  • ¥15 stm32f407使用DMA问题
  • ¥15 您好 这个API接口该怎么弄 网站搭建好了 API也有 现在就不知道该怎么填写API 不知道怎么用
  • ¥88 用uniapp写一个多端的程序,用到高德地图,用高德的JSAPI吗?
  • ¥20 关于#c++#的问题:水果店管理系统
  • ¥30 dbLinq最新版linq sqlite
  • ¥20 对D盘进行分盘之前没有将visual studio2022卸载掉,现在该如何下载回来
  • ¥15 完成虚拟机环境配置,还有安装kettle