Hibernate笔记②--hibernate类生成表、id生成策略、级联设置、继承映射
一、多表的一个关联关系
老师和学生是一对多的关系
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 <column </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 <id <column <generator </id>
<property <property <many-to-one <column </many-to-one> </class>
|
Theacher.hbm.xml
|
<?xml <!DOCTYPE hibernate-mapping "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping> <class <id <column <generator </id> <property <set <key> <column </key> <one-to-many </set> </class> </hibernate-mapping> |
还要在hibernate.cfg.xml
添加:
|
<mapping <mapping |
三 id的生成策略
<id name="实体类属性名" type="java.lang.Integer">
<column name="对应表中主键字段名" />
<generator class="assiged|increment|identity|native|........" />
</id>
generator class的属性如下:
- identity 数据库自动增长的 Oracle数据库不支持
②increment 程序调用增长的 select max(id)from table
他们的共性是都是自增长,程序员无序指定属性值。
③uuid 通过Java.util.uuid类生成的唯一的标识符,
④native 将主键的生成交给数据库,hibernate不管。
⑤assigned 在插入主键的时候由程序处理。
⑥sequence 调用底层数据库序列生成主键,适用于Oracle
四cascade的属性
- save-update当保存或修改对象时,级联保存所有与之关联的临时对象,级联更新所有与之关联的托管对象。
- delete 如果老师删了的话 学生也就没了。级联删除所有与之关联的对象。
- all 包括save-update和delete 的所有属性
inverse 老师放弃维护关系,级联保存的时候
节省update的语句
指定谁来维护关联关系,不是必须的,在关联关系中,通常让多的那一方来维护关联关系。
五继承关系映射
鉴别器
product book ps
三种方式 类的结构相同 配置文件不同导致 映射出来的表结构不一样。
第一种方式 不同对象生成的一张表,表中的字段会因类型的不同留空
|
<hibernate-mapping> <class <id <column <generator </id> <discriminator <property <property <subclass <property </subclass> <subclass <property </subclass> </class> </hibernate-mapping> |
第二种方式
每一个类建立自己的一张表 ,表间的一对一关系用外键关联描述
Jioned-subclass 来描述子表特有的属性
|
<hibernate-mapping> <class <id <generator </id> <property <column </property> <property <joined-subclass <key <property </joined-subclass>
<joined-subclass <key <property </joined-subclass> </class> </hibernate-mapping> |
第三种方式 将每个类的所有属性都建立一个表,(包含着父类的所有属性)
Unioned-subclass
|
<hibernate-mapping> <class <id <generator </id>
<property <column </property>
<property </property>
<union-subclass <property </union-subclass> <union-subclass <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生成策略、级联设置、继承映射的更多相关文章
- Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略
Hibernate 加载数据 有get,跟Load 1.懒加载: 使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库. @Test publ ...
- hibernate的持久化类、主键生成策略
一.hibernate的持久化类 1.什么是持久化类: 持久化:将数据存储到关系型数据库. 持久化类:与数据库中的数据表建立了某种关系的java类.(持久化类=javabean+映射配置文件) 2.持 ...
- hibernate笔记--使用注解(annotation)方式配置单(双)向多对一的映射关系
前面几篇都是介绍的用配置文件来实现实体类到数据库表的映射,这种方式是比较麻烦的,每一个pojo类都需要写一个相应的*.hbm.xml,无疑增加了很多代码量,不过也有优点就是利于维护,为了方便开发,Hi ...
- Hibernate笔记——Hibernate介绍和初次环境配置
Hibernate简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate ...
- Hibernate、Mybatis 通过数据库表反向生成java类和配置
一.通过MyEclipse生成Hibernate类文件和hbm.xml文件,或者annotation文件 (转载孙宇老师的文章) 二.Mybatis生成实体类和配置文件: myeclipse下生 ...
- Hibernate学习笔记(八) — 懒载入与抓取策略
懒载入(Load On Demand)是一种独特而又强大的数据获取方法,它可以在用户滚动页面的时候自己主动获取很多其它的数据,而新得到的数据不会影响原有数据的显示,同一时候最大程度上降低server端 ...
- 基于UUID生成短ID
为什么需要短ID 数据库操作过程最常用到: 自增ID UUID 前者多数依赖Mysql的auto_increment,但数据移植麻烦. 如果是主从或主主,不同库里自增ID还可能不一致. 后者长度是个问 ...
- Hibernate学习笔记(三)Hibernate生成表单ID主键生成策略
一. Xml方式 <id>标签必须配置在<class>标签内第一个位置.由一个字段构成主键,如果是复杂主键<composite-id>标签 被映射的类必须定义对应数 ...
- 使用hibernate利用实体类生成表和利用表生成实体类
1,配置数据库,这里以oracle数据库为例.点击右侧Database图标:
随机推荐
- linux 学习第十八天学习(DNS分离解析、DHCP配置、邮件服务配置)
DNS分离解析技术 yum install bind-chroot systemctl restart named systemctl enable named vim /etc/named.conf ...
- 如何在Windows版本的VMware虚拟机上安装苹果系统
有时我想玩玩苹果系统,但自己有没有mac,只能在虚拟机上装一个苹果玩玩,但又由于某些原因虚拟机软件VMware不支持安装苹果系统,还在有大佬出于不明目的,在网上散布了适用于Windows版本的VMwa ...
- Hadoop(18)-MapReduce框架原理-WritableComparable排序和GroupingComparator分组
1.排序概述 2.排序分类 3.WritableComparable案例 这个文件,是大数据-Hadoop生态(12)-Hadoop序列化和源码追踪的输出文件,可以看到,文件根据key,也就是手机号进 ...
- 小程序犯错(一):“ReferenceError: 模拟服务器传来的数据 is not defined”
学习数据绑定,在onLoad中模拟服务器传数据时,报错:模拟服务器传来的数据 is not defined 我这里粗心的忘记注释说明了,如下: 把该行无关的错误数据注释或删除即可.这里提醒同学们,出现 ...
- Modelsim SE自动化仿真——如何将.do文件中自定义的库链接到testbench顶层模块
我们用Modelsim SE进行仿真时,为了方便,一般会编写.do文件来启动当前仿真.关于.do文件的编写,一般网上都有成型的模板,我们只要稍微改几个参数,就可以符合我们的仿真需求了.但是如果仿真时需 ...
- 9.26 开课第二十三天 (JS表单验证)
<form action="lizi1.html" method="post"> 非空验证 <input type="text&qu ...
- CSS快速入门-盒子模型
一.CSS盒子模型概述 css盒子模型 又称框模型 (Box Model) ,包含了元素内容(content).内边距(padding).边框(border).外边距(margin)几个要素. con ...
- 如何写一个Xss Bot
如何写一个Xss Bot 现在的ctf比赛里 xss的出题方式比较特殊,一般使用xss bot,所以借鉴大佬经验尝试弄一个xss题目. xss bot 就是代替管理员去完成点击页面的任务,bot需要能 ...
- Jmeter接口测试(五)变量及参数化
在请求过程中,有时我们需要在请求中设置一些变量来测试不同的场景. 提示:在调试请求过程中,无关的请求可以暂时禁用掉,选择某个暂时不用的请求,右键--禁用 Jmeter 支持以下类型变量:所有类型的变量 ...
- Docker Manager for Docker Swarm deploy
一.Swarm概述 Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Doc ...