求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个回答

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

用 HQL 删除的会牵扯到缓存的问题,至于load 和 get,如果查不着数据的话,一个会抛异常,另一个会返回 null.

load()的时候不发SQL语句,只有在需要的时候才发,而get()是不管下文需不需要直接发SQL(或HQL)语句。所以,看你的情况用load()比较好!而你说的删除不成功我不太明白!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问