一、多表的一个关联关系

老师和学生是一对多的关系

student:tid属性 外键约束 对应teacher表中的id属性

teacher:id

在myeclipse的db窗口中选中两个表来生成类。

 

写一个CRUD

//老师和学生实体保存

    public void save(){

        Teacher t=new Teacher();

        t.setName("彭老师");

        

        Student s1=new Student();

        s1.setName("郭靖");

        

        Student s2=new Student();

        s2.setName("杨康");

        

        s1.setTeacher(t);

        s2.setTeacher(t);

        

        Set<Student> ss=new HashSet<Student>();

        ss.add(s1);

        ss.add(s2);

        t.setStudents(ss);

        

        Session session=HibernateSessionFactory.getSession();

        Transaction tx=session.beginTransaction();

        session.save(s1);

        session.save(s2);

        tx.commit();

        HibernateSessionFactory.closeSession();

    }

 

此时实体是保存不进去的,需要在学生实体的hbm.xml配置文件中的many-to-one 标签中添加cascade="all" 设置级联级别为all

 

<many-to-one
name="teacher" class="com.hibernate.entity.Teacher"
fetch="select"
cascade="all">

<column
name="tid"
/>

</many-to-one>

此时数据才可插入成功。老师和学生都可以保存。

 

①对象的三种状态

1临时状态:

使用new命令开辟内存空间的Java对象,在内存中孤立存在

2持久状态:

数据库中存在。

3游离状态

与Session关联的对象

 

由类和配置文件生成表的类

    Configuration cfg = new Configuration().configure("/hibernate.cfg.xml");

        SchemaExport export = new SchemaExport(cfg);

        export.create(true, true);

 

 

手写一个配置文件

Stu.hbm.xml

    <class
name="com.hibernate.model.Stu"
table="t_stu">

        <id
name="id">

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

            <generator
class="uuid"></generator>

        </id>

        

        <property
name="name"></property>

        <property
name="age"></property>

        <many-to-one
name="teacher"
class="com.hibernate.model.Teacher"
cascade="save-update">

            <column
name="tid"></column>

        </many-to-one>

    </class>

 

Theacher.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">

 

<hibernate-mapping>

    <class
name="com.hibernate.model.Teacher"
table="t_table">

        <id
name="id">

            <column
name="id"/>

            <generator
class="uuid"></generator>

        </id>

        <property
name="name"></property>

        <set
name="stus"
cascade="delete">

            <key>

                <column
name="tid"></column>

            </key>

            <one-to-many
class="com.hibernate.model.Stu"/>

        </set>

    </class>

</hibernate-mapping>

 

还要在hibernate.cfg.xml

添加:

    <mapping
resource="com/hibernate/model/Teacher.hbm.xml"
/>

    <mapping
resource="com/hibernate/model/Stu.hbm.xml"
/>

 

 

三 id的生成策略

<id name="实体类属性名" type="java.lang.Integer">

<column name="对应表中主键字段名" />

<generator class="assiged|increment|identity|native|........" />

</id>

generator class的属性如下:

  1. identity 数据库自动增长的 Oracle数据库不支持

②increment 程序调用增长的 select max(id)from table

他们的共性是都是自增长,程序员无序指定属性值。

③uuid 通过Java.util.uuid类生成的唯一的标识符,

④native 将主键的生成交给数据库,hibernate不管。

⑤assigned 在插入主键的时候由程序处理。

⑥sequence 调用底层数据库序列生成主键,适用于Oracle

 

 

四cascade的属性

  1. save-update当保存或修改对象时,级联保存所有与之关联的临时对象,级联更新所有与之关联的托管对象。
  2. delete 如果老师删了的话 学生也就没了。级联删除所有与之关联的对象。
  3. all 包括save-update和delete 的所有属性

     

 

inverse 老师放弃维护关系,级联保存的时候

节省update的语句

指定谁来维护关联关系,不是必须的,在关联关系中,通常让多的那一方来维护关联关系。

 

 

 

五继承关系映射

鉴别器

 

product book ps

三种方式 类的结构相同 配置文件不同导致 映射出来的表结构不一样。

 

第一种方式 不同对象生成的一张表,表中的字段会因类型的不同留空

<hibernate-mapping>

    <class
name="com.hibernate.entity.Product"
table="t_product"
discriminator-value="A">

        <id
name="id"
>

            <column
name="id"
/>

            <generator
class="uuid"></generator>

        </id>

        <discriminator
column="type"
type="string"></discriminator>

        <property
name="name"></property>

        <property
name="price"></property>

        <subclass
name="com.hibernate.entity.Book"
discriminator-value="B">

            <property
name="author"></property>

        </subclass>

        <subclass
name="com.hibernate.entity.Ps"
discriminator-value="P">

            <property
name="handler"></property>

        </subclass>

        </class>

</hibernate-mapping>

 

第二种方式

每一个类建立自己的一张表 ,表间的一对一关系用外键关联描述

Jioned-subclass 来描述子表特有的属性

<hibernate-mapping>

    <class
name="com.hibernate.entity.Product"
table="t_product">

        <id
name="id"
type="java.lang.String">

            <generator
class="uuid"/>

        </id>

        <property
name="name"
type="java.lang.String">

            <column
name="name"
length="20"/>

        </property>

        <property
name="price"
type="java.lang.Double"></property>

        <joined-subclass
name="com.hibernate.entity.Book"
table="t_book">

            <key
column="bid"></key>

            <property
name="author"></property>

        </joined-subclass>

        

        <joined-subclass
name="com.hibernate.entity.Ps"
table="t_Ps">

            <key
column="pid"></key>

            <property
name="handler"></property>

        </joined-subclass>

    </class>

</hibernate-mapping>

 

第三种方式 将每个类的所有属性都建立一个表,(包含着父类的所有属性)

Unioned-subclass

<hibernate-mapping>

<class
name="com.hibernate.entity.Product"
table="t_product">

<id
name="id"
type="java.lang.String">

<generator
class="uuid"
/>

</id>

 

<property
name="name"
type="java.lang.String">

<column
name="NAME"
length="20"
/>

</property>

 

<property
name="price" type="java.lang.Double">

</property>

 

<union-subclass
name="com.hibernate.entity.Book"
table="t_book">

    <property
name="author"></property>

</union-subclass>

<union-subclass
name="com.hibernate.entity.Ps"
table="t_ps">

    <property
name="handler"></property>

</union-subclass>

</class>

</hibernate-mapping>

 

使用crud进行测试

package com.hibernate.dao;

 

import java.util.HashSet;

import java.util.Set;

 

import org.hibernate.Hibernate;

import org.hibernate.Session;

import org.hibernate.Transaction;

 

import com.hibernate.entity.Book;

import com.hibernate.entity.Product;

import com.hibernate.entity.Ps;

import com.hibernate.model.Teacher;

import com.hibernate.model.Stu;

import com.hibernate.util.HibernateSessionFactory;

 

public class CRUD {

    //老师和学生实体保存

    public void save(){

        Teacher t=new Teacher();

        t.setName("彭老师");

        

        Stu s1=new Stu();

        s1.setName("郭靖");

        

        Stu s2=new Stu();

        s2.setName("杨康");

        

        s1.setTeacher(t);

        s2.setTeacher(t);

        

        Set<Stu> ss=new HashSet<Stu>();

        ss.add(s1);

        ss.add(s2);

        t.setStus(ss);

        

        Session session=HibernateSessionFactory.getSession();

        Transaction tx=session.beginTransaction();

        session.save(s1);

        session.save(s2);

        tx.commit();

        HibernateSessionFactory.closeSession();

    }

    //保存 product对象

    public void save2(){

        Product p=new Product();

        p.setName("产品");

        p.setPrice(100.00);

        Book b=new Book();

        b.setName("钢铁是怎样练成的");

        b.setPrice(99.9);

        b.setAuthor("奥斯特洛夫斯基");

        

        Ps p1=new Ps();

        p1.setName("play station");

        p1.setPrice(230);

        p1.setHandler("尼古拉");

        

        Session session=HibernateSessionFactory.getSession();

        Transaction tx=session.beginTransaction();

        session.save(p);

        session.save(b);

        session.save(p1);

        tx.commit();

        HibernateSessionFactory.closeSession();

    }

    

    //将product对象 查找出来

    public void query(){

        Session session=HibernateSessionFactory.getSession();

        Product p=(Product)session.get(Product.class, "4028d0814ec3de48014ec3de49950002");

        System.out.println(p.getPrice());

        Book b=(Book)p;

        System.out.println(b.getAuthor());

        HibernateSessionFactory.closeSession();

        

    }

    public static void main(String[] args) {

        CRUD crud=new CRUD();

//        crud.save2();

        crud.query();

    }

}

 

 

 

 

Hibernate笔记②--hibernate类生成表、id生成策略、级联设置、继承映射的更多相关文章

  1. Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略

    Hibernate 加载数据 有get,跟Load 1.懒加载: 使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库. @Test publ ...

  2. hibernate的持久化类、主键生成策略

    一.hibernate的持久化类 1.什么是持久化类: 持久化:将数据存储到关系型数据库. 持久化类:与数据库中的数据表建立了某种关系的java类.(持久化类=javabean+映射配置文件) 2.持 ...

  3. hibernate笔记--使用注解(annotation)方式配置单(双)向多对一的映射关系

    前面几篇都是介绍的用配置文件来实现实体类到数据库表的映射,这种方式是比较麻烦的,每一个pojo类都需要写一个相应的*.hbm.xml,无疑增加了很多代码量,不过也有优点就是利于维护,为了方便开发,Hi ...

  4. Hibernate笔记——Hibernate介绍和初次环境配置

    Hibernate简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate ...

  5. Hibernate、Mybatis 通过数据库表反向生成java类和配置

    一.通过MyEclipse生成Hibernate类文件和hbm.xml文件,或者annotation文件    (转载孙宇老师的文章) 二.Mybatis生成实体类和配置文件: myeclipse下生 ...

  6. Hibernate学习笔记(八) — 懒载入与抓取策略

    懒载入(Load On Demand)是一种独特而又强大的数据获取方法,它可以在用户滚动页面的时候自己主动获取很多其它的数据,而新得到的数据不会影响原有数据的显示,同一时候最大程度上降低server端 ...

  7. 基于UUID生成短ID

    为什么需要短ID 数据库操作过程最常用到: 自增ID UUID 前者多数依赖Mysql的auto_increment,但数据移植麻烦. 如果是主从或主主,不同库里自增ID还可能不一致. 后者长度是个问 ...

  8. Hibernate学习笔记(三)Hibernate生成表单ID主键生成策略

    一. Xml方式 <id>标签必须配置在<class>标签内第一个位置.由一个字段构成主键,如果是复杂主键<composite-id>标签 被映射的类必须定义对应数 ...

  9. 使用hibernate利用实体类生成表和利用表生成实体类

    1,配置数据库,这里以oracle数据库为例.点击右侧Database图标:

随机推荐

  1. koa2学习笔记02 - 给koa2添加系统日志 —— node日志管理模块log4js

    前言 没有日志系统的后台应用是没有灵魂的, 平时工作中每次我们遇到接口报错的时候, 都会叫后台的童鞋看下怎么回事, 这时后台的童鞋都会不慌不忙的打开一个骚骚的黑窗口. 一串噼里啪啦的命令输进去, 哐哐 ...

  2. Golang并行判断素数

    ## Golang多核判断素数方式 package main import ( "bufio" "fmt" "os" "runti ...

  3. 十张图了解Docker【转】

    这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别. 当我对Docker技术还是一知半解的时候,我 ...

  4. [arc081F]Flip and Rectangles-[黑白染色]

    Description 传送门 Solution 有一个神秘的结论..我不知道大佬是怎么场上推出来的. 一个黑白染色图,每次可以任意翻转行或列的颜色,如果每个2*2的子矩阵内黑色格子都是偶数个,则可以 ...

  5. jQuery学习-设置访问元素样式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. TMS320VC5509串口通信

    1. 串口通信使用MCBSP外设的DX1,DRA引脚 很多同学喜欢把这个MCBSP驱动音频芯片TLV320AIC23,同时也作为串口,那么一般用的拨码开关去选择,反正自己看着拨一下 2. 遇到的一个问 ...

  7. 从轻测到上线,WeTest与《一起来捉妖》测试方案大公开

    从2016年Pokémon GO引发的AR游戏热潮开始,国内就一直在期待新的一款具备代表性的AR游戏的头部作品. 4月11日的腾讯首款AR探索手游<一起来捉妖>不仅为国内市场注入了新的活力 ...

  8. 2018年美国大学生数学建模竞赛(MCM/ICM) B题解题思路

    老套路,把我们在解决B题时候采用的思路分享给大家,希望大家能学到点东西~~~ B题思路整理:Part1:先整理出说某种语言多的十个国家给找出来,或者说是把十种语言对应的国家找出来 然后再对各个国家的人 ...

  9. 安装php xdebug调试工具及性能分析工具webgrind for windows

    安装php xdebug调试工具及性能分析工具webgrind for windows 第一步:查看php版本等信息 phpinfo(); 上面是 x86 NTS VC14 第二步: 下载xdebug ...

  10. First Day!

    刚申请博客第一天,多多关照! 小弟,给各位大佬递茶! 出现什么错误, 还请明确指出! 现在, 正在找工作, 如果有老哥, 公司缺人, 何不让老弟我去试试! 不入前端, 不知水深. 一入前端, 如入泥潭 ...