读书人

hibernate入门(7):一对一

发布时间: 2012-10-24 14:15:58 作者: rapoo

hibernate入门(七):一对一
3.一对一关系映射:

典型的实例:一个人有一个身份证,而一个身份证只属于某一个人。以此为模型实现一对一关系的映射。下面的实例先以主键进行关联:

主键关联:从表的主键同时又作为外键参考主表的主键。比如在下面的实例中,人作为主表,身份证作为从表。

>>步骤一,建立Person类及相关的实体配置文件。

>>步骤二,建立IdCard类及相关的实体配置文件。
配置文件说明:由于上面提到的是采取主键关联,即是说这里的id即是主键,同时也是(关联相关表的)外键,因此,以下对id的生成采取了”foreign”方式,其实这种方式也就指明了主键同时为外键。下面的<param>指定了外键的参考信息,此元素中的内容指明了它参考<one-to-one>的person。 注意在<one-to-one name="person" constrained="true">中设定了constrained属性,其作用是说明该配置文件所映射表的主键同时作为外键,参照关联类对应表的主键。设定了此属性可用“show create table idcard”查看表idcard的定义发生了变化。

>>步骤三,修改主配置文件,关联上面的实体配置文件。

>>步骤四,编写测试类,OneToOneTest.java 内容如下:省略导入的包。

然后再在main方法中调用此方法,并开启控制台数据库库语言显示后,可以从控制台看出查询主对象只select一次;再增加一个查询从对象的方法,主要代码:
同样在main方法中调用此方法,并开启控制台数据库库语言显示后。从控制台看出也只会查询一次,但是如果去掉注释后发现会查询两次。  接着,在此例的基础上修改成外键关联。

外键关联:从表的主键并不作为外键参考主表的主键,而是将其它字段作为外键参的主键。

其实在上例的基础上,我们只需要修改IdCard.hbm.xml配置文件即可,修改后的内容如下:

说明:由于采取了外键关联,所以这里的从表的主键将不再作为外键参考主表的主键,所以它会采取一般的方式生成主键,即<id>生成和以前的那此相同采取“native”方式。 另注意到< many-to-one >,发现增加了unique有属性,这样尽管是多对一,但能有效保证实质是一对一。  这时运行原OneToOneTest,发现仍是和以前一样。 如果我们再修改Person的实体配置文件<one-to-one>如下:

<one-to-one name="idCard" property-ref="person"/> 特别要注意到property-ref 属性。可以结合执行后表的结构来看。其实如果注释掉此句,其结果就是通过身份证可以查看到Person的相关信息,但是通过Person却不能找到身份证信息,因为Hibernate完全依赖实体配置文件(映射文件)。注释掉当然就不能找到。而事实上这时在OneToOne中调用query方法,会发现出现空指针异常。其实在前面的关联关系中,最终都是实现了双向关联,而这里如果注释掉此句,正好成了单向关联的一个例证。

读书人网 >软件架构设计

热点推荐