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



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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值