zhangkaitao / es

JavaEE项目开发脚手架(我的公众号:kaitao-1234567,我的新书:《亿级流量网站架构核心技术》)
https://github.com/zhangkaitao/es
Apache License 2.0
2.17k stars 1.59k forks source link

请教 #7

Closed ghost closed 11 years ago

ghost commented 11 years ago

请教kaitao一个问题:

1》多对多关联,List/Set类型选择问题;http://stackoverflow.com/questions/8174667/hibernate-many-to-many-relations-set-or-list 2》hashCode/equals方法问题;http://stackoverflow.com/questions/5031614/the-jpa-hashcode-equals-dilemma

zhangkaitao commented 11 years ago

1、这个根据实际情况选, 比如如果需要顺序 则使用List 否则就是Set 2、因为Set是不允许重复的,所以比如 Set.add(new User()) Set.add(new User())

则使用User的默认id 如果id默认是0 则第二个覆盖第一个; 因此造成问题,所以可以考虑 重写hashCode/equals 1、随机id 2、如果是默认值 则认为不相等

ghost commented 11 years ago

@ManyToMany(mappedBy = "roleList", fetch=FetchType.LAZY) @Where(clause="del_flag='"+DEL_FLAG_NORMAL+"'") @OrderBy("id") @Fetch(FetchMode.SUBSELECT) @NotFound(action = NotFoundAction.IGNORE) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public List getUserList() { return userList;

}

@ManyToMany(fetch=FetchType.EAGER) @JoinTable(name = "sys_user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") }) @Where(clause="del_flag='"+DEL_FLAG_NORMAL+"'") @OrderBy("id") @Fetch(FetchMode.SUBSELECT) @NotFound(action = NotFoundAction.IGNORE) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public List getRoleList() { return roleList;

}

这样注解下的多对多双向关联,使用List,在通过role.SaveUser(user);的时候,会先执行delete all from user_role,然后再全部insert into。(输出的HQL语句中看出来的这个问题),而使用Set就不会这样,使用Set只会insert新值。

zhangkaitao commented 11 years ago

不建议多对多 还是使用两个一对多把 而且对于你这种用户-角色 根本不推荐这种做法 如一个角色可能对应许多用户 级联查 会全部查出, 也很难优化

使用非关联吧。 我几乎不用多对多(我还没有遇到很合适的场景)

zhangkaitao commented 11 years ago

你可以参考我的设计

ghost commented 11 years ago

好的@!谢谢您的解答~!感谢~