Hibernate一对一关系操作对象
总的来说有四种方式,我将意义的在本片文章中介绍
一:以主键关联
概念:关联的两个实体共享一个主键 例如我们建立两个表,分别为user id pk,name,password userinfor id pk,email,age,address user和userinfor共享一个主键id,并且两个表是一对一关系,那么如何让一个表引用另一个表生成的主键那?我们可以用hibernate的主键foreign机制生成。
我们先看看user.hbm.xml文件 ....... <hibernate-mapping> <class name="model.User" lazy="true"> <id name="id" unsaved-value="null"> <generator class="uuid.hex"/> </id> <property name="name" type="string"/> <property name="password" type="string"/> <one-to-one name="userinfor" class="model.Userinfor" fetch="join" cascade="all" /> </class> <hibernate-mapping> ....... one-to-one的属性cascade=all表示user的增删改操作也会反映在userinfor对象当中。我们再看看userinfor.hbm.xml文件. <hibernate-mapping> <id name="id"> <generator name="foreign"> <param name="property">user</param> </generator> </id> <property name="email" column="email" type="string"/> <property name="age" column="age" type="int"/> <property name="address" column="address" type="string"/> <one-to-one name="user" class="model.User" constrained="true"<!-引用user的主键id为外键--> /> </hibernate-mapping> 让我们看看java的代码片段 ..... User user=new User(); user.setName("name"); user.setPassword("pass"); Userinfor u=new Userinfor(); u.setEmail("email"); u.setAge(11); u.setAddress("address"); user.setUserinfor(u); u.setUser(user); DAO.saveObj(user); 最后打开你的数据库旧可以看到结果了。
二,一对一以外键关联
以外键关联的概念:两个实体各自有不同的主键,但是一个实体有一个外键引用另一个实体的主键。例如: 表 user id pk,name,passeword userinfor id pk,uid fk,infor 先看user.hbm.xml ...... <hibernate-mapping> <class name="user" table="user" lazy="true"> <id name="id" unsaved-value="null"> <generator class="uuid.hex"/> </id> <property name="name" type="string"/> <property name="password" type="string"/> <one-to-one name="userinfor" class="model.Userinfor" fetch="join" cascade="all" /> </class> </hibernate-mapping> 可以看到这个同我们第一次用到的一样啊 然后我们看看userinfor.hbm.xml的结构 ..... <hibernate-mapping> <class name="userinfor" table="userinfor" lazy="true"> <id name="id"> <generator class="uuid.hex"/> </id> <property name="infor" column="infor" type="string"/> <many-to-one name="user" class="model.User" unique="true" <!-唯一的多对一,其实就便成了一对一了--> columnn="uid" /> </class> </hibernate-mapping> 以外键关联的一对一,其实就变成了一对多的双向关联,编写时直接按照一对多和多对一的要求编写,最后在many-to-one加上unique='true'即可说明他只不过是一对多关系的一个特例。编写java代码: ....... User u=new User(); u.setName("name"); u.setPassword("password"); Userinfor ui=new Userinfor(); ui.setInfor("infor"); u.setUserinfor(ui); ui.setUser(u); DAO.saveObj(u); ......
三:默认的级连关系
一对多默认级连关系为预先抓取,而一对多,多对多都是立即加载 看看user.hbm.xml <one-to-one name="userinfor" class="model.Userinfor" cascade="all"/> 以上我们并没有显示的设置级连关系。这样在取的userinfor时将用默认的级连关系。 ..... User u=(User)DAO.getByid(User.class,"字符穿,相当于where id='此值'");
四:延迟加载
一对一关系进行延迟加载时与其他关系不同,多对一是在class标签中设置lazy='true',一对多和多对多是在set标签中设置lazy=”true“,而一对一则在class标签当中设置lazy='true'并且在one-to-one标签当中设置constrained='true'。 ..... <hibernate-mapping> <class name="model.User" table="user"> <one-to-one name="userinfor" class="model.Userinfor" contrained="true" cascade="all" /> </class> </hibernate-mapping> java代码 ... User u=(User)DAO.getByid(User.class,"id"); ..... 次代码只是加载了user对象,而没有加载userinfor对象,而且忽略了默认的预先抓取,(这是默认的,只有显示的指定fatch='true'时才采用预先抓取的) 完