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