Hibernate"双向一对一"关联,没有成功? 但Hibernate的文档可没这么说啊 ^_^ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 > 1v1双向你究竟要实现什么呢通过Address对象能获取Person对象;删除Address对象时,也能删除与它关联的Person对象。其实我的真实场景是:有表Title与表Content,Title表示标题,Content表示详文。1个标题可以有0个或1个详文;1个详文必须与1个(且只能是1个)标题关联。当删除某个标题时,与该标题关联的详文也要被级联删除;当删除某个详文时,不影响与它关联的标题;通过标题(详文)对象能够得到与之详文(标题)对象。 我想,既然Hibernate文档中特别分明了"单向一对一"和"双向一对一",那么应该是可以实现的吧。 address.hbm.xml加下一句<one-to-one name="person" class="entity.TPerson" cascade="all" property-ref="TAddress"/>person.hbm.xml <many-to-one name="TAddress" class="entity.TAddress" fetch="select"> <column name="addressid" /> </many-to-one> 相信楼主看得明白.. 双向一对一是一定能成功的,我做过很多这样的例子 感谢楼上的回复。不过...你的配置与Hibernate中的配置没什么区别吧?文档中的两个hbm文件内容如下:<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <many-to-one name="address" column="addressId" unique="true" not-null="true"/></class><class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> <one-to-one name="person" property-ref="address"/></class> 刚才我实际测试了Hibernate文档中的那个例子,确实能够实现"双向一对一"。那我还是再检查一下自己应用中的映射文件吧。 fetch="select"查下这个用法 发现了一些有趣的东西了。Hibernate默认使用id字段进行关联。把Hibernate文档中的那个例子稍作修改:为Address表加一个字段--addressCode,该字段表示"业务"中的address标识符,而原来的addressId仅作为一个没有任务业务意义的代理主键。Person表的addressId则与addressCode进行关联。那么Person.hbm.xml中需要有如下语句:<many-to-one name="address" column="addressCode" property-ref="addressCode" unique="true" not-null="true" />而Address.hbm.xml中则有:<property name="addressCode" column="addressCode" type="java.lang.Long" length="20" />此时,再通过ID值获取Address对象时,会看到如下形式的SQL:select a.addressId, a.addressCode, p.personId, p.addressCode from Address a left outer join Person p on a.addressId=p.addressCode where a.addressId=?"a.addressId=p.addressCode",可以看到是Address中的addressId,而不是addressCode,与Person中的addressCode关联。很显然,这(很可能)无法查找出Person中的相关数据。 单向好像不是太好,细心看一下Hibernate的帮助文档,你就知道了!!! 虽说,可以把此处的"one-to-one"换成"one-to-many",但这并不是不使用"one-to-one"的理由吧 ^_^ 今后的工程,死也不用hibernate了....自己封装操作层..... jquery-easyui tree如何实现单击节点ajax取下级数据 谁帮我看一下这段JS代码 哪里出错了 谢谢 web迷茫,求高手指点 java环境变量设置问题,急求 Spring项目应用情况调查! 装JDK时出现的问题 我现在启动TOMCAT 出现的界面和以前不一样了 是怎么回事? 第一次配置Weblogic时左边显示不出来页面,出现提示框说是要下架Java虚拟机。 我想找工作,但是担心不好找,我情况是这样,兄弟们给看看。。 请教关于播放WAV声音文件的方法 路径struts 请问 Apache 下面的 logging 和 commons 下的 logging 有什么区别啊?
通过Address对象能获取Person对象;删除Address对象时,也能删除与它关联的Person对象。其实我的真实场景是:
有表Title与表Content,Title表示标题,Content表示详文。
1个标题可以有0个或1个详文;1个详文必须与1个(且只能是1个)标题关联。
当删除某个标题时,与该标题关联的详文也要被级联删除;当删除某个详文时,不影响与它关联的标题;
通过标题(详文)对象能够得到与之详文(标题)对象。
<one-to-one name="person" class="entity.TPerson" cascade="all" property-ref="TAddress"/>person.hbm.xml
<many-to-one name="TAddress" class="entity.TAddress" fetch="select">
<column name="addressid" />
</many-to-one>
相信楼主看得明白.. 双向一对一是一定能成功的,我做过很多这样的例子
不过...你的配置与Hibernate中的配置没什么区别吧?文档中的两个hbm文件内容如下:
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
unique="true"
not-null="true"/>
</class><class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
<one-to-one name="person"
property-ref="address"/>
</class>
那我还是再检查一下自己应用中的映射文件吧。
查下这个用法
Hibernate默认使用id字段进行关联。把Hibernate文档中的那个例子稍作修改:
为Address表加一个字段--addressCode,该字段表示"业务"中的address标识符,而原来的addressId仅作为一个没有任务业务意义的代理主键。
Person表的addressId则与addressCode进行关联。
那么Person.hbm.xml中需要有如下语句:
<many-to-one name="address" column="addressCode"
property-ref="addressCode" unique="true" not-null="true" />而Address.hbm.xml中则有:
<property name="addressCode" column="addressCode"
type="java.lang.Long" length="20" />此时,再通过ID值获取Address对象时,会看到如下形式的SQL:
select a.addressId, a.addressCode, p.personId, p.addressCode from Address a left outer join Person p on a.addressId=p.addressCode where a.addressId=?
"a.addressId=p.addressCode",可以看到是Address中的addressId,而不是addressCode,与Person中的addressCode关联。很显然,这(很可能)无法查找出Person中的相关数据。