shiyide 2009-06-18 12:24
浏览 289
已采纳

关于hibernate的一个问题

Configuration config = new Configuration().configure("hibernate.oracle.cfg.xml");
Session session = config.buildSessionFactory().openSession();
TUser tUser = (TUser) session.load(TUser.class, new Integer(10002));
List emails = tUser.getEmail();
//List emails = new ArrayList();
emails.add("jerry.zhou@163.com");
emails.add("jerry.zhou@163.com");
session.beginTransaction();
TUser userInfo = new TUser();
userInfo.setName("Peter");
userInfo.setEmail(emails);
session.save(userInfo);
session.getTransaction().commit();

我刚学hibernate,我今天在测试hibernate的用户自定类型的时候发现一个很有趣的问题;
我用load方法调用原来的一条记录. 取这条记录的email值,并增加2个email. 做为一条新的记录保存, 但我发现当我保存的时候他会将我load出来的那条纪录的更新(email变成增加后的了). 我查看hibernate的SQL日志发现他多执行了一条update语句
Hibernate: select tuser0_.USERID as USERID0_0_, tuser0_.USERNAME as USERNAME0_0_, tuser0_.EMAIL as EMAIL0_0_ from hibernate.t_user tuser0_ where tuser0_.USERID=?
Hibernate: select seq_id.nextval from dual
Hibernate: insert into hibernate.t_user (USERNAME, EMAIL, USERID) values (?, ?, ?)
Set method executed
[color=red]Hibernate: update hibernate.t_user set USERNAME=?, EMAIL=? where USERID=? [/color]

我如果将save方法屏蔽 保留事务 代码改成如下:
Configuration config = new Configuration().configure("hibernate.oracle.cfg.xml");
Session session = config.buildSessionFactory().openSession();
TUser tUser = (TUser) session.load(TUser.class, new Integer(10002));
List emails = tUser.getEmail();
//List emails = new ArrayList();
emails.add("jerry.zhou@163.com");
emails.add("jerry.zhou@163.com");
session.beginTransaction();
session.getTransaction().commit();

他还是会执行update语句.

这是怎么回事呢?

  • 写回答

3条回答 默认 最新

  • wanghaolovezlq 2009-06-18 12:36
    关注

    你看清楚没有

    TUser tUser = (TUser) session.load(TUser.class, new Integer(10002));
    List emails = [color=red]tUser.getEmail();[/color]
    //List emails = new ArrayList();
    [color=red]emails.add("jerry.zhou@163.com");
    emails.add("jerry.zhou@163.com"); [/color]

    你先加载出tUser,随后又改变了它的emails,当然要执行更新了
    update hibernate.t_user set USERNAME=?, EMAIL=? where USERID=?

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

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧