首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

[转]一对一主键联系关系映射(单向)

2012-10-17 
[转]一对一主键关联映射(单向)一对一主键关联映射(单向) 出处:http://yangfei520.blog.51cto.com/1041581/

[转]一对一主键关联映射(单向)
一对一主键关联映射(单向)

出处:http://yangfei520.blog.51cto.com/1041581/273097

??????一对一主键关联映射是hibernate关联映射中比较重要的一种,使用于两个关系比较紧密的对象之间的关联,一对一不说,一般还要共存亡。hibernate的做法是让两个实体对象的id保持相同。
???? 人和身份证是典型的一对一关联映射的例子。
????
1.实体模型:

此处单向是由person加载idcard,所以Person中要保存IdCard的对象。
?
2.关系模型:
?表person??????????????????????????????????????? 表idCard
? -----------------------??????????????????--------------------------
? | id? |??????????name?? |??????????????????? | id? |???????? cardNo?????|
?------------------------?????????????????--------------------------
?
3.实体类:
??

   //IdCard.java   public class IdCard { ??   private Integer id; ?   ?private String cardNo; ????????//一系列的setter.getter方法     }

?
 //Person.java  public class Person { ??private Integer id; ?? private String name; ??  private IdCard idCard; ???//一系列的setter.getter方法 }

?
4.映射文件:
?
 //IdCard.hbm.xml??<class name="com.sxt.hibernate.one2one.entity.IdCard" table="sxt_hibernate_idCard"> ????<id name="id" length="4"> ??????<generator length="10"></property> ??</class>?? //Person.hbm.xml??<class name="com.sxt.hibernate.one2one.entity.Person" table="sxt_hibernate_person"> ????<id name="id" length="4"> ??????<!-- person的主键来源于idCard,也就是共享idCard的主键 --> ??????<generator length="10"></property> ????<!--one-to-one标签的含义,指示Hibernate如何加载它的关联对象,默认根据主键加载。 ??????constrained="true"的含义,表明当前主键上存在一个约束,person的主键作为外键参照了idCard, ??????这里在进行person对象操作时,要求idCard不 能为null ????????--> ????<one-to-one name="idCard" constrained="true"></one-to-one> ??</class>

?
5.hibernate配置文件:
?// hibernate.cfg.xml??<session-factory> ????<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:ORCL10</property> ????<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> ????<property name="hibernate.connection.username">scott</property> ????<property name="hibernate.connection.password">yf123</property> ????<property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property> ????<property name="hibernate.show_sql">true</property> ???? ????<mapping resource="com/sxt/hibernate/one2one/entity/IdCard.hbm.xml"/> ????<mapping resource="com/sxt/hibernate/one2one/entity/Person.hbm.xml"/> ??</session-factory>

6.测试方法:
? //test.java??public static void main(String[] args) { ????Session session = HibernateUtils.getSession(); ????Transaction t = session.beginTransaction(); ????try { ??????/** ????????* 测试插入操作 ????????*/ /*??????IdCard idCard = new IdCard(); ??????idCard.setCardNo("1234567890"); ??????Person person = new Person(); ??????person.setName("张三"); ??????person.setIdCard(idCard); ??????//不会出现TransientObjectException异常,因为一对一主键关联映射中默认了cascad属性 ??????session.save(person);*/ ??????/** ????????* 测试加载操作 ????????*/ ??????Person p=(Person)session.load(Person.class, 1); ??????System.out.println(p); ??????System.out.println(p.getIdCard()); ??????t.commit(); ????} catch (HibernateException e) { ??????e.printStackTrace(); ??????t.rollback(); ????} finally { ??????HibernateUtils.closeSession(session); ????} ??} }?

7.测试结果:(打印对象时,我覆盖了Person和IdCard类的toString()方法)
? Hibernate: select hibernate_sequence.nextval from dualPerson:张三Idcard:1234567890Hibernate: insert into sxt_hibernate_idCard (cardNo, id) values (?, ?)Hibernate: insert into sxt_hibernate_person (name, id) values (?, ?)
本文出自 “夜狼” 博客,请务必保留此出处http://yangfei520.blog.51cto.com/1041581/273097
本文出自 51CTO.COM技术博客

热点排行