hibernate不解的问题!求助

kiOm 2005-07-29 03:03:07
父亲与儿子,一对多双向关联:

Father.hbm.xml
----------------------------
...
<bag name="childList" table="CHILD" cascade="none" lazy="false" inverse="false">
<key column="FATHERID" />
<one-to-many class="Child />
</bag>
...
----------------------------

Child.hbm.xml
----------------------------
...
<many-to-one name="father" column="FATHERID" class="Father"></many-to-one>
...
----------------------------

...
List fatherList = session.find( "FROM Father" );
Father modifyFather = (Father)father.get( 0 );
Child child = new Child(); //创建一个儿子
father.getChildList().add( child ); //指定父亲新增一个创建的儿子
Transaction transaction = session.beginTransaction();
session.save( modifyFather );
transaction.commit();
...

执行的SQL竟然是:
...
Hibernate: update TYPE set DICTIONARYID=? where ID=?
...
而不是:
...
Hibernate: insert TYPE (?) values (?)
...

这是怎么回事呢?
而且打印出来很多都是 ? ,看不清楚SQL到底是插入或更新的什么数据????
...全文
236 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
leonyuann 2005-08-11
  • 打赏
  • 举报
回复
笔误,应该是子表,不是自表
leonyuann 2005-08-11
  • 打赏
  • 举报
回复
自表映射文件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。
kiOm 2005-08-11
  • 打赏
  • 举报
回复
COMMON的id数据类型是 long 。
尝试改变初始值为0,但结果一样。
郁闷~~~????
adsl314 2005-08-10
  • 打赏
  • 举报
回复
COMMON的id数据类型是什么的?如果是int的应该是0。Long的就应该是null
出现这个问题就是hibernate以为已经存在了所以就用update。
kiOm 2005-08-10
  • 打赏
  • 举报
回复
顶一下
kiOm 2005-08-08
  • 打赏
  • 举报
回复
事实上,我上里面的"父"和"子"都是继承一张叫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 ...

为什么????????????????
zhenyang2002 2005-08-05
  • 打赏
  • 举报
回复
你需要指定 child 的 unsaved-value.
kiOm 2005-08-04
  • 打赏
  • 举报
回复
很抱歉,楼上的,我没找到你在哪篇文章有提到这个问题.
zhenyang2002 2005-08-01
  • 打赏
  • 举报
回复
呵呵,我刚解决这个问题,http://blog.csdn.net/zhenyang2002
kiOm 2005-08-01
  • 打赏
  • 举报
回复
up
kiOm 2005-07-29
  • 打赏
  • 举报
回复
我的主要问题是:
--------------------------------------------------------------
执行的SQL竟然是:
...
Hibernate: update TYPE set DICTIONARYID=? where ID=?
...
而不是:
...
Hibernate: insert TYPE (?) values (?)
...

这是怎么回事呢?
-------------------------------------------------------------
zhenyang2002 2005-07-29
  • 打赏
  • 举报
回复
看看数据库不就知道了^_^

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧