您的位置:首页 > 编程语言 > Java开发

hibernate学习之三----映射关系

2016-07-04 02:28 375 查看
hibernate的映射关系

hibeinate的关联的关系

在“persion.hbm.xml”的映射文件的配置文件

<!DOCTYPE hibernate-mapping PUBLIC 

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

    

<hibernate-mapping package="com.briup.day5.one2one">//这里的package标签里面配置的是pojo类的

//这里的pojo类就是Persion类,package标签里面写的是pojo类(这里的pojo类就是Persion)的包名。

//如果在package标签里面不写包名也行,那么久需要在以下的class标签里面的name属性填入Persion

//(pojo类)的完整的路径,如这里的完整的路径是;com.briup.day5.one2one.Persion

    <class name="Person" table="tbl_person">

        <id name="id" column="id">

            <generator class="increment"/>

        </id>

        <property name="name"/>

      <!-- 在主方配置一对一 -->

      <one-to-one name="card" class="Card" />

       

    </class>

</hibernate-mapping>

通过配置该映射文件,代码就可以根据pojo类和映射文件来建立一张表。

现在还有一种技术:就是我们有数据表和映射文件,就可以直接建一个pojo类。

一般在写的时候我们都会先写pojo类,然后在写映射文件“.xml”文件,但后期我们不用写

".xml"映射文件了,因为后期我们有 i not cation 注解。

映射关系

1:1

  1)、是一对多的一种特列(定义一个外键,加一个唯一性的约束)

        Persion (主)
  id   name  age
  101  Terry 12
  Crad(从)

            id  name  age

            1    1001  101

            2   1002   101

//在这里要使用的是将外码Persion的id定义在Crad的表中的列是唯一的存在。

  2)、从表的id与主表的id保持一致

     Persion (主)
  id   name  age
  101  Terry 12
  102  tom   13

    Crad(从)

           id    num      age

           101   1001     101
  102   1002     101

Persion和Card的id都是唯一的,所以他们的关系也是唯一的

//单项维护和双向维护。

//双向维护如下:

  ORM :---Object  Mapping   Relatation

    1、 Persion

        private Card card;

    

    2、Card 

        private Persion persion;

1)、Persion的映射文件的配置:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC 

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

    

<hibernate-mapping package="com.briup.day5.one2one">

    <class name="Person" table="tbl_person">

        <id name="id" column="id">

            <generator class="increment"/>

        </id>

        <property name="name"/>

      <!-- 在主方配置一对一 -->

      <one-to-one name="card" class="Card" property-ref="persion"/>//name的属性的值是Persion中的从表对象的属性
//而class的属性的属性值则是从表的类名。
//如果少配property-ref="card"这个属性的话,那么程序将会产生一个bug,这个bug就
//是(主)表中的id不能自动以(从)表中的外键相匹配,加这个属性是为了让(主)表
//中的主键找到(从表)中的外键相匹配。但(从)表中已经配置了 column="p_id"了,
//所以(从)表可以根据 该属性来匹配(主)表。实现一对一

//通过主键的方式设置一对一的关联关系的时候不需要配置该属性。

//指定关联的属性名,这个属性将会和本类的主键相对应。如果没有指定,会使用对方关联类的主键。

//不是数据库表中的字段名,而是定义的java类中的属性名,一定要注意

    </class>

</hibernate-mapping>

2)、Card的映射文件的的配置

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC 

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

    

<hibernate-mapping package="com.briup.day5.one2one">

    <class name="Card" table="tbl_card">

        <id name="id" column="id">

            <generator class="foreign">//设置主键的生成方式是外键的外键,

            <param name="property">person</param>//参照的是persion的主键

            </generator>//设置完后card的主键,与persion的主键是保持一致的。

        </id>

        <property name="number"/>

        <property name="address"/>

        <!-- 在从方配置一对一 -->

        <one-to-one name="person" class="Person"/>
//<many-to-one name="person" class="Person" unique="true" colum="p_id"/>
//因为一对一是一对多的一个特列,但是加一个唯一的属性unique="true",那么一对多就
//变成一对一的关系了。colum="p_id":是外键,外键是在(从)表中维护的

    </class>

</hibernate-mapping>

//这里配置完,就代表我么的一对一的映射关系配置完毕。

把映射文件加到配置文件“hibernate.cfg.xml”中

//在后期,为了代码的运行的测试,可以在写完一步操作是,就需要及时的测试,看代码是否有问题。

配置好后,就可以开始测试了:

测试的类如下:

public class Test{

   public static void main(String[] args){

        Session session=HibernateSessionFactory.getSession();

Transaction tran=session.openTransaction();
//出生
session.save(new Persion("terry","dadad",0));//刚出生

//18岁了,办证

        Persion persion=(Persion)session.load(Persion.class,1L);//load方法中
//的第一个参数是要查询的类的“类名.class”字节码文件,第一个参数是这个类中的
//属性名,按那个属性名来查询。
Card card=new Card(.....);
//维护外键persion--card  p_id
card.setPersion(persion);
//保存到数据库
session.save(card);

//丢身份证

        /*Card card = (Card) session.load(Card.class, 1L);
System.out.println(card.getPerson().getName());*/

Person p = (Person)session.load(Person.class, 1L);
System.out.println(p.getName()+":"+p.getCard().getNumber());

tran.commit();

   }

}

1:n一对多的关联关系

Customer的映射文件"Customer.hbm.xml"的配置

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC 

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

    

<hibernate-mapping package="com.briup.day5.one2many">

    <class name="Customer" table="tbl_customer">

        <id name="id" column="id">

            <generator class="increment"/>

        </id>

        <property name="name"/>

        <property name="telephone"/>

        <property name="address"/>

        

        <!-- 关联映射 --><--!关联映射这里比较难,需要背并记住-->

        <set name="orders"> //一对多的关系,所以用的是set的标签。

        <key column="c_id"/>//设置外键,外键这里是在Order表中的。

        <one-to-many class="Order"/>//设置Customer对应多个Order

        </set>

        

    </class>

</hibernate-mapping>

Order的映射文件"Order.hbm.xml"的配置

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC 

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

    

<hibernate-mapping package="com.briup.day5.one2many">

    <class name="Order" table="tbl_order">

        <id name="id" column="id">

            <generator class="increment"/>

        </id>

        <property name="total"/>

        <property name="orderDate"/>

        <!-- 关联映射 -->

        <many-to-one name="customer" class="Customer" />//设置多个Order对应一个Customer。

    </class>

</hibernate-mapping>

在“一”的一方配置:<set name="orders"> //一对多的关系,所以用的是set的标签。

           <key column="c_id"/>//设置外键,外键这里是在Order表中的。

           <one-to-many class="Order"/>//设置Customer对应多个Order

                 </set>

而在“多”的一方配置:<many-to-one name="customer" class="Customer" />

到这里一对多的关系就建成功了。

在类中叫做关联属性----但在映射文件中就叫关联映射。

配置好后,就可以开始测试了:

测试的类如下:

package com.briup.day5.one2many;

import org.hibernate.Session;

import org.hibernate.Transaction;

import com.briup.day5.HibernateSessionFactory;

public class Test {
public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();

//注册用户
save

//用户登录   通过id  load  get

//下订单 创建订单并且让该订单和顾客关联

//顾客查找自己所有的订单

tran.commit();
}

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