有2个类,question与1p是一对多的关系
在questiondaoImpl中有一个方法
public void addIp(int questionId, Ip ip)
{
Question bean = this.getHibernateTemplate().get(Question.class, id);
Set<Ip> set = bean.getIps();
set.add(ip);
}该方法执行完之后,控制台打印出的sql语句为:
Hibernate: select question0_.id_ as id1_0_0_, question0_.name_ as name2_0_0_, question0_.type_ as type3_0_0_, question0_.repetition_ as repetition4_0_0_, question0_.valid_ as valid5_0_0_, question0_.startdate_ as startdate6_0_0_, question0_.enddate_ as enddate7_0_0_ from vote.question question0_ where question0_.id_=?
Hibernate: select items0_.question_id_ as question4_1_, items0_.id_ as id1_1_, items0_.item_index_ as item5_1_, items0_.id_ as id1_1_0_, items0_.name_ as name2_1_0_, items0_.result_ as result3_1_0_, items0_.question_id_ as question4_1_0_ from vote.item items0_ where items0_.question_id_=?
Hibernate: select ips0_.question_id_ as question3_1_, ips0_.id_ as id1_1_, ips0_.id_ as id1_2_0_, ips0_.address_ as address2_2_0_, ips0_.question_id_ as question3_2_0_ from vote.ip ips0_ where ips0_.question_id_=?
Hibernate: insert into vote.ip (address_, question_id_, id_) values (?, ?, ?)
Hibernate: update vote.ip set question_id_=? where id_=?
也就是先查出一个question对象和Ips集合,然后将ip插入到ip表中
最后更新ip表请问我代码中的set明明就只是一个集合,为什么会自动跟新数据库?

解决方案 »

  1.   

    楼主不知道JBOSS团队为了hibernate框架的成熟性,特意还针对SET接口单独进行了实现吗....
    我们平时用的是API中的SET实现类,而hibetnate用的是自己实现的Set实现类...对我们的不一样,这就是面向接口编程的特点
      

  2.   

    没明白啊import java.util.Date;
    import java.util.List;
    import java.util.Set;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.vote.bean.Ip;
    import com.vote.bean.Question;
    import com.vote.dao.QuestionDAO;我在该dao里面也没有导入你所说的专门的set实现类啊
      

  3.   

    Set <Ip> set = bean.getIps(); set 得到是hibernate的持久化对象 所以修改set 会和数据库同步
      

  4.   

    public void addIp(int questionId, Ip ip) 

    Question bean = this.getHibernateTemplate().get(Question.class, id); //你这个Id从哪来的?...
    Set <Ip> set = bean.getIps(); 
    ip.setQuestion(bean);
    set.add(ip); 
      

  5.   

    建议楼主去看看hibernate的一些原理文章、配置详解、数据表映射类的几个状态等。
    如果楼主设置了Questtion与IP的关系级联保存的话,会根据spring中切入的事务提交后,hibernate的session自动根据修改来更新、同步数据库,非spring的情况下是手动提交事务的时候。
      

  6.   

    hibernate 的延迟加载。和缓存机制。。
      

  7.   

    此实现类在:
    org.hibernate.collection下的PersistentSet类中....
    此类对传入的Set实现类中的数据进行了重新操作..........
      

  8.   

    根据领域驱动模型里说的,任何变化都应该要保持一个不变性,对聚合根,也就是这里的Question,它聚合了其它对象,当你设置了里面的集合,当然要作出变化了.至于这是哪里做出的变化,是要看Hibernate里的源码了.
      

  9.   

    hibernate 的延迟加载。和缓存机制。。