`
nishifei
  • 浏览: 15237 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Hibernate 一对多 Select delete insert

阅读更多

EbpEnterprise 企业基础表:                          一端

EbpEnterpriselanguage企业信息表:            多端

这两个表之间是 一对多的关系。

 

EbpEnterprise : 部分代码:

 

@CollectionOfElements(fetch = FetchType.EAGER)
    @JoinTable(
  name = "ebp_enterpriselanguage",
  joinColumns = { @JoinColumn(name = "enterprise_id", referencedColumnName = "id") })
 @IndexColumn(name = "idx")
 public Set<EbpEnterpriselanguage> getEels() {
  return eels;
 }
 
 public void setEels(Set<EbpEnterpriselanguage> eels) {
  this.eels = eels;
 }

这里配置一个一对多的关系。

 

EbpEnterpriselanguage : 部分代码 。

@Embeddable
public class EbpEnterpriselanguage{

 private java.lang.String locale;
 private java.lang.String artificialPerson;
 private java.lang.String name;
 private java.lang.String forShort;
 private java.lang.String profile;
 private java.lang.String profileOutline;
 private java.lang.String scope;
 private java.lang.String address;
 private java.lang.String contactPerson;

 public EbpEnterpriselanguage(){
 }
 
 @Column(name = "locale", unique = false, nullable = false, insertable = true, updatable = true, length = 10)
 public java.lang.String getLocale() {
  return this.locale;
 }
 
 public void setLocale(java.lang.String value) {
  this.locale = value;
 }
 
 @Column(name = "artificial_person", unique = false, nullable = true, insertable = true, updatable = true, length = 300)
 public java.lang.String getArtificialPerson() {
  return this.artificialPerson;
 }
 

 

 

问题是 : 我在对   EbpEnterprise(一端)  进行查询的时候(任何查询操作)   都会在 EbpEnterpriselanguage 里面执行 一条删除语句 和成 平房增长的 Insert 语句  ,导致的结果是 EbpEnterpriselanguage  表里多了好多重复的记录, 而且越查越多  。

 

产生这样的原因是什么 ,  解决方法是 什么 。  有什么办法可以不 执行  Delete和Insert 语句哪 ?

 

分享到:
评论
2 楼 nishifei 2009-03-09  
首先: 我的EbpEnterpriselanguage  这个表 里面已经有了一个自增长的 ID, 这个表是一个联合主键的表 , 另外一个主键就是一个外键 关联到 EbpEnterpirse 的ID上的一个字段。


但是我认为就是 他这个自增主键的 问题, 每次 查  为什么要执行 delete 和 insert 语句 哪, 即使是执行了 正常的情况下   是 先删除 多 表里面的 相关的记录 , 然后 加上 新 的记录 其实  内容 都是一样的, 现在 的问题是  删除的时候可能 没有删除 成功   紧接着 有执行 插入语句, 可是为什么插入的 语句的条数 是不固定的 , 如果删一条在加一条我也就忍了,



谢谢  你的回答 。
1 楼 tinyyea 2009-03-09  
hi,
我认为正确实现EbpEnterpriselanguage的hashCode和equals方法可能会有帮助。

事务在提交时检查EbpEnterprise的状态,多端的set通过hashCode和equals来判断其状态,如果没有正确实现hashcode和equals方法,这个判断会出现问题,hibernate可能认为集合中的元素是新的值对象,而之前那个状态的值对象找不到了,所以删除这些对象,然后插入新的(hibernate认为它们是新的)对象,这不像实体对象那样可能通过unsaved-value来判断。

考虑一些问题:
值对象EbpEnterpriselanguage中哪些字段是比较静态的,不变的。
值对象中的字段是否可以提取自然主键。
用这些字段去实现hashcode和equals方法会减少很多类似的Bug,但不完全能解决问题。
尝试给值对象EbpEnterpriselanguage加上一个自动生成的主键ID,hibernate判断时发现id不为null时触发update语句,而不会delete再insert!对于id为null的对象则立即插入。

希望对你帮助!

相关推荐

Global site tag (gtag.js) - Google Analytics