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语句.
这是怎么回事呢?