您的位置:首页 > 其它

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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: