hibernate 关联关系 一对一 主键关联
2014-09-13 23:05
323 查看
一对一关联关系的使用
一对一关系在实际生活中是比较常见的,例如学生与学生证的关系,通过学生证可以找到学生。一对一关系在Hibernate中的实现有两种方式,分别是主键关联和外键关联。
以主键关联
主键关联的重点是,关联的两个实体共享一个主键值。例如,student与card是一对一关系,它们数据库中对应的表分别是t_student与t_card。它们共用一个主键值值id,这个主键可由t_student或t_card表生成。问题是如何让另外一张表引用已经生成的主键值呢?例如,t_student表填入了主键id的值,t_card表如何引用它?这需要在Hibernate的映射文件中使用主键的foreign生成机制。
以下的DB操作都是基于MyEclipse自带在Derby数据库
student1的表结构:
create table "CLASSICCARS"."STUDENT1"(
"ID" BIGINT not null,
"NAME" VARCHAR(20),
"CARD_ID" BIGINT,
"SEX" VARCHAR(5),
"AGE" BIGINT,
constraint "SQL140913082545570" primary key ("ID")
);
Card的表结构:
create table "CLASSICCARS"."CARD"(
"ID" BIGINT,
"NAME" VARCHAR(20)
);
student1.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<!-- lazy为true表示延迟加载(从数据库中取得数据,组装好一个对象(比如学生1)后,不会立即再从数据库取得数据,组装此对象关联的对象(学生证1),而是等到需要时,才会从数据库取得数据,组装此关联对象);
为false表示立即加载(从数据库中取得数据,组装好一个对象(比如学生1)后,会立即再从数据库取得数据,组装此对象关联的对象(学生证1)),-->
<class name="hibernateTest.Student1" table="STUDENT1" schema="CLASSICCARS" lazy="true">
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="20" />
</property>
<!--
<property name="cardId" type="java.lang.Long">
<column name="CARD_ID" />
</property>
-->
<property name="sex" type="java.lang.String">
<column name="SEX" length="5" />
</property>
<property name="age" type="java.lang.Long">
<column name="AGE" />
</property>
<!-- 一对一关系,casecade表明操作是否从父对象级联到被关联对象 取值:none,save-update,delete,all,delete-orphan -->
<one-to-one name="card" class="hibernateTest.Card"
fetch="join" cascade="all">
</one-to-one>
</class>
</hibernate-mapping>
Card.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="hibernateTest.Card" table="CARD" schema="CLASSICCARS" lazy="true">
<id name="id" column="id">
<generator class="foreign">
<param name="property">student1</param>
</generator>
</id>
<!-- constrained=true 表示card引用了student的主键作为外键 -->
<one-to-one name="student1" class="hibernateTest.Student1" constrained="true"></one-to-one>
<property name="name" column="name" type="string"></property>
</class>
</hibernate-mapping>
student1 pojo
public class Student1 {
private Long id;
private String name;
private Long card_id;
private String sex;
private Long age;
private Card card;
//省略get/set方法
}
card pojo
public class Card {
private Long id;
private String name;
private Student1 student1;
//省略get/set方法
}
hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.DerbyDialect
</property>
<property name="connection.url">
jdbc:derby://localhost:1527/myeclipse
</property>
<property name="connection.username">classiccars</property>
<property name="connection.password">myeclipse</property>
<property name="connection.driver_class">
org.apache.derby.jdbc.ClientDriver
</property>
<property name="myeclipse.connection.profile">
MyEclipse Derby
</property>
<property name="show_sql">
true
</property>
<mapping resource="hibernateTest/Student1.hbm.xml" />
<mapping resource="hibernateTest/Card.hbm.xml" />
</session-factory>
</hibernate-configuration>
//main method test
public static void main(String[] args) {
// TODO Auto-generated method stub
//Configuration conf=new Configuration().configure();
//SessionFactory sf=conf.buildSessionFactory();
// Session session=sf.openSession();
Session session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
Student1 stu=new Student1();
stu.setName("zhouxingci");
stu.setSex("Male");
stu.setAge((long)52);
Card card=new Card();
card.setName("zhouxingci");
stu.setCard(card);
card.setStudent1(stu);
session.save(stu);
/*
stu=(Student1) session.get(Student1.class, new Long(1));
System.out.println("username="+stu.getName()+";card_id="+stu.getCard_id());
//Card card=(Card) session.get(Card.class, new Long(stu.getId()));
Card card=stu.getCard();
System.out.println("card name="+card.getName());
*/
tx.commit();
session.close();
}
一对一关系在实际生活中是比较常见的,例如学生与学生证的关系,通过学生证可以找到学生。一对一关系在Hibernate中的实现有两种方式,分别是主键关联和外键关联。
以主键关联
主键关联的重点是,关联的两个实体共享一个主键值。例如,student与card是一对一关系,它们数据库中对应的表分别是t_student与t_card。它们共用一个主键值值id,这个主键可由t_student或t_card表生成。问题是如何让另外一张表引用已经生成的主键值呢?例如,t_student表填入了主键id的值,t_card表如何引用它?这需要在Hibernate的映射文件中使用主键的foreign生成机制。
以下的DB操作都是基于MyEclipse自带在Derby数据库
student1的表结构:
create table "CLASSICCARS"."STUDENT1"(
"ID" BIGINT not null,
"NAME" VARCHAR(20),
"CARD_ID" BIGINT,
"SEX" VARCHAR(5),
"AGE" BIGINT,
constraint "SQL140913082545570" primary key ("ID")
);
Card的表结构:
create table "CLASSICCARS"."CARD"(
"ID" BIGINT,
"NAME" VARCHAR(20)
);
student1.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<!-- lazy为true表示延迟加载(从数据库中取得数据,组装好一个对象(比如学生1)后,不会立即再从数据库取得数据,组装此对象关联的对象(学生证1),而是等到需要时,才会从数据库取得数据,组装此关联对象);
为false表示立即加载(从数据库中取得数据,组装好一个对象(比如学生1)后,会立即再从数据库取得数据,组装此对象关联的对象(学生证1)),-->
<class name="hibernateTest.Student1" table="STUDENT1" schema="CLASSICCARS" lazy="true">
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="20" />
</property>
<!--
<property name="cardId" type="java.lang.Long">
<column name="CARD_ID" />
</property>
-->
<property name="sex" type="java.lang.String">
<column name="SEX" length="5" />
</property>
<property name="age" type="java.lang.Long">
<column name="AGE" />
</property>
<!-- 一对一关系,casecade表明操作是否从父对象级联到被关联对象 取值:none,save-update,delete,all,delete-orphan -->
<one-to-one name="card" class="hibernateTest.Card"
fetch="join" cascade="all">
</one-to-one>
</class>
</hibernate-mapping>
Card.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="hibernateTest.Card" table="CARD" schema="CLASSICCARS" lazy="true">
<id name="id" column="id">
<generator class="foreign">
<param name="property">student1</param>
</generator>
</id>
<!-- constrained=true 表示card引用了student的主键作为外键 -->
<one-to-one name="student1" class="hibernateTest.Student1" constrained="true"></one-to-one>
<property name="name" column="name" type="string"></property>
</class>
</hibernate-mapping>
student1 pojo
public class Student1 {
private Long id;
private String name;
private Long card_id;
private String sex;
private Long age;
private Card card;
//省略get/set方法
}
card pojo
public class Card {
private Long id;
private String name;
private Student1 student1;
//省略get/set方法
}
hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.DerbyDialect
</property>
<property name="connection.url">
jdbc:derby://localhost:1527/myeclipse
</property>
<property name="connection.username">classiccars</property>
<property name="connection.password">myeclipse</property>
<property name="connection.driver_class">
org.apache.derby.jdbc.ClientDriver
</property>
<property name="myeclipse.connection.profile">
MyEclipse Derby
</property>
<property name="show_sql">
true
</property>
<mapping resource="hibernateTest/Student1.hbm.xml" />
<mapping resource="hibernateTest/Card.hbm.xml" />
</session-factory>
</hibernate-configuration>
//main method test
public static void main(String[] args) {
// TODO Auto-generated method stub
//Configuration conf=new Configuration().configure();
//SessionFactory sf=conf.buildSessionFactory();
// Session session=sf.openSession();
Session session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
Student1 stu=new Student1();
stu.setName("zhouxingci");
stu.setSex("Male");
stu.setAge((long)52);
Card card=new Card();
card.setName("zhouxingci");
stu.setCard(card);
card.setStudent1(stu);
session.save(stu);
/*
stu=(Student1) session.get(Student1.class, new Long(1));
System.out.println("username="+stu.getName()+";card_id="+stu.getCard_id());
//Card card=(Card) session.get(Card.class, new Long(stu.getId()));
Card card=stu.getCard();
System.out.println("card name="+card.getName());
*/
tx.commit();
session.close();
}
相关文章推荐
- Hibernate 第十讲 表关联关系(四)双向一对一主键关联
- Hibernate 第十讲 表关联关系(五)一对一联合主键关联
- Hibernate关联关系之一对一(主键关联)
- Hibernate关联关系映射之一对一(主键关联)
- Hibernate 第十讲 表关联关系(三)单向项一对一主键关联
- 3.一对一单向主键关联(人对身份证) hibernate.cfg.xml
- hibernate一对一主键双向关联
- Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
- Hibernate映射详解--一对一主键关联映射
- 【SSH之旅】一步步学习Hibernate框架(二):一对一关联映射中的主键关联
- hibernate双向一对一主键关联映射XML与注解版
- Hibernate一对一主键关联映射(单向)
- Hibernate一对一 主键关联映射(one-to-one)
- Hibernate关系映射(3)_一对一单向主键关联
- Hibernate 一对一主键双向关联
- Hibernate一对一主键单向关联关系
- Hibernate一对一关联(共享主键)
- Hibernate_映射_关联关系_一对一映射3_基于主键的方式
- Hibernate 一对一主键双向关联
- hibernate一对一主键关联映射双向