iteye_15788
iteye_15788
2010-04-03 19:39

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

  • 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条回答

为你推荐