我的主要问题是:
--------------------------------------------------------------
执行的SQL竟然是:
...
Hibernate: update TYPE set DICTIONARYID=? where ID=?
...
而不是:
...
Hibernate: insert TYPE (?) values (?)
...这是怎么回事呢?
-------------------------------------------------------------

解决方案 »

  1.   

    呵呵,我刚解决这个问题,http://blog.csdn.net/zhenyang2002
      

  2.   

    你需要指定 child 的 unsaved-value.
      

  3.   

    事实上,我上里面的"父"和"子"都是继承一张叫COMMON的表的,而COMMON的ID字段已设置 unsaved-value = "-1" 。
    具体如下:
    ------------------------------------
    <hibernate-mapping>
        <class name="com.sztoilet.domainObject.Common" table="COMMON">
            <id name="id" column="ID" unsaved-value="-1" >
                <generator class="increment" />
            </id>        //父亲
            <joined-subclass name="Father" table="FATHER">
                <key column="ID" />
                <bag name="childList" table="CHILD" cascade="none" lazy="false" inverse="false">
                    <key column="FATHERID" />
                    <one-to-many class="Child />
                </bag>
            </joined-subclass>        //孩子
            <joined-subclass name="Child" table="CHILD">
                <key column="ID" />
                <many-to-one name="father" column="FATHERID" class="Father" />
            </joined-subclass>    </class>
    </hibernate-mapping>然后执行:
    Child child = new Child();  //创建一个儿子
    father.getChildList().add( child );  //指定父亲新增一个创建的儿子
    生成的SQL语句只有 update ... 没有 insert ...为什么????????????????
      

  4.   

    COMMON的id数据类型是什么的?如果是int的应该是0。Long的就应该是null
    出现这个问题就是hibernate以为已经存在了所以就用update。
      

  5.   

    COMMON的id数据类型是 long 。
    尝试改变初始值为0,但结果一样。
    郁闷~~~????
      

  6.   

    自表映射文件id字段的unsaved-value属性设为any
    显式的使用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value的。某些情况下(父子表关联保存),当你在程序中并没有显式的使用save或者update一个持久对象,那么Hibernate需要判断被操作的对象究竟是一个已经持久化过的持久对象PO,是一个尚未被持久化过的内存临时对象VO。
    Hibernate如何判断究竟对child是save还是update呢?它会取一下child的主键属性 child.getId() ,如果取到的Id值和hbm映射文件中指定的unsave-value相等,那么Hibernate认为child是新的内存临时对象,发送save,如果不相等,那么Hibernate认为child是已经持久过的对象,发送update。