一对一关系•现在考虑每一个User配给一间Room,形成一对一,user表格透过room_id作为外键参考至room数据表设计•在表格建立方面,使用多对一中的表格建立语句就可以了:CREATETABLEuser(idINT(11)NOTNULLauto_incrementPRIMARYKEY,nameVARCHAR(100)NOTNULLdefault'',room_idINT(11));CREATETABLEroom(idINT(11)NOTNULLauto_incrementPRIMARYKEY,addressVARCHAR(100)NOTNULLdefault'');对象设计•对象方面,User的实例会引用Room实例,而Room实例也引用User实例User.javapublicclassUser{privateIntegerid;privateStringname;privateRoomroom;publicUser(){}publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicRoomgetRoom(){returnroom;}publicvoidsetRoom(Roomroom){this.room=room;}}Room.javapublicclassRoom{privateIntegerid;privateStringaddress;privateUseruser;publicRoom(){}publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}publicStringgetAddress(){returnaddress;}publicvoidsetAddress(Stringaddress){this.address=address;}publicUsergetUser(){returnuser;}publicvoidsetUser(Useruser){this.user=user;}}映射文件•使用外键来完成一对一,其实就是限制多对一关系中,「多」的一方只能有一个参考至「一」的一方,也就是多对一关系的一个特例,这可以在映射文件中使用many-to-one节点时,加上“unique”属性来设定。User.hbm.xml?xmlversion=1.0encoding=utf-8?!DOCTYPEhibernate-mappingPUBLIC-//Hibernate/HibernateMappingDTD3.0//EN=“com.itjob.wujin.vo.Usertable=useridname=idcolumn=idtype=java.lang.Integergeneratorclass=native//idpropertyname=namecolumn=nametype=java.lang.String/many-to-onename=roomcolumn=room_idclass=“com.itjob.wujin.vo.Roomcascade=allouter-join=trueunique=true//class/hibernate-mapping映射文件•到这边为止,单向一对一的映像已经完成,如果要再完成双向一对一的关系,则可以在Room.hbm.xml中使用one-to-one节点来定义•在one-to-one中,property-ref告诉Hibernate,查询出user并将其参考至room。Room.hbm.xml?xmlversion=1.0encoding=utf-8?!DOCTYPEhibernate-mappingPUBLIC-//Hibernate/HibernateMappingDTD3.0//EN=“com.itjob.wujin.vo.Roomtable=roomidname=idcolumn=idgeneratorclass=native//idpropertyname=addresscolumn=addresstype=java.lang.String/one-to-onename=userclass=“com.itjob.wujin.vo.Userproperty-ref=room//class/hibernate-mapping储存对象Useruser1=newUser();user1.setName(bush);Roomroom1=newRoom();room1.setAddress(NTU-M8-419);user1.setRoom(room1);Useruser2=newUser();user2.setName(caterpillar);Roomroom2=newRoom();room2.setAddress(NTU-M8-418);user2.setRoom(room2);Sessionsession=sessionFactory.openSession();Transactiontx=session.beginTransaction();session.save(user1);session.save(user2);tx.commit();session.close();查询对象•在查询Room时,User也会一起加载Sessionsession=sessionFactory.openSession();Roomroom=(Room)session.load(Room.class,newInteger(23));System.out.println(room.getUser().getName());session.close();•上面的查询程序,Hibernate将使用以下的SQL:Hibernate:selectroom0_.idasid1_,room0_.addressasaddress1_1_,user1_.idasid0_,user1_.nameasname0_0_,user1_.room_idasroom3_0_0_fromroomroom0_leftouterjoinuseruser1_onroom0_.id=user1_.room_idwhereroom0_.id=?一对一关系•一对一关联的另一种方式,是限制两个实体的主键必须一致,如此直接透过两个表格的主键就可确定一对一关联,而不用额外的外键参考。数据表设计•例如user与room表格,可以如下建立:CREATETABLEuser(idINT(11)NOTNULLauto_incrementPRIMARYKEY,nameVARCHAR(100)NOTNULLdefault'');CREATETABLEroom(idINT(11)NOTNULLauto_incrementPRIMARYKEY,addressVARCHAR(100)NOTNULLdefault'');•User类别Room类的设计使用一对一(唯一外键关联)中的设计即可User.hbm.xml?xmlversion=1.0encoding=utf-8?!DOCTYPEhibernate-mappingPUBLIC-//Hibernate/HibernateMappingDTD3.0//EN=“com.itjob.wujin.vo.Usertable=useridname=idcolumn=idtype=java.lang.Integergeneratorclass=native//idpropertyname=namecolumn=nametype=java.lang.String/one-to-onename=roomclass=com.itjob.wujin.vo.Roomcascade=all//class/hibernate-mapping映射文件•在Room的id主键上,使用foreign表示与外键共享主键,也就是与User实体共享主键,而constrained设定为true,表示约束room的主键必须与user中对应资料的主键相同。Room.hbm.xml?xmlversion=1.0encoding=utf-8?!DOCTYPEhibernate-mappingPUBLIC-//Hibernate/HibernateMappingDTD3.0//EN=com.itjob.wujin.vo.Roomtable=roomidname=idcolumn=idgeneratorclass=foreignparamname=propertyuser/param/generator/idpropertyname=addresscolumn=addresstype=java.lang.String/one-to-onename=userclass=com.itjob.wujin.vo.Userconstrained=true//class/hibernate-mapping储存对象Useruser1=newUser();user1.setName(bush);Roomroom1=newRoom();room1.setAddress(NTU-M8-419);//互相设定关联user1.setRoom(room1);room1.setUser(user1);Useruser2=newUser();user2.setName(caterpillar);Roomroom2=newRoom();room2.setAddress(NTU-M8-418);储存对象//互相设定关联user2.setRoom(room2);room2.setUser(user2);Sessionsession=sessionFactory.openSession();Transactiontx=session.beginTransaction();session.save(user1);session.save(user2);tx.commit();session.close();储存对象:结果mysqlselect*fromuser;+----+-------------+|id|name|+----+-------------+|1|bush||2|caterpillar|+----+-------------+2rowsinset(0.00sec)mysqlselect*fromroom;+----+------------------+|id|address|+----+------------------+|1|NTU-M8-419||2