hibernate中间表
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于hibernate中间表内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在hibernate中间表相关知识领域提供全面立体的资料补充。同时还包含 h6、hack、hadoop 的知识内容,欢迎查阅!
hibernate中间表相关知识
-
Hibernate【入门篇】tags: Hibernate 前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了! 什么是Hibernate框架? Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象! 为什么要使用Hibernate? 既然Hibernate是关于Java对象和关系数据库之间的联系的话,也就是我们MVC中的数据持久层->在编写程序中的DAO层... 首先,我们来回顾一下我们在DAO层写程序的历程吧: 在DAO
-
Java面试题:Hibernate的二级缓存与Hibernate多表查询我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点。1、请介绍一下Hibernate的二级缓存解题按照以下思路来回答:(1)首先说清楚什么是缓存;(2)再说有了hibernate的Session就是一级缓存,即有了一级缓存,为什么还要有二级缓存;(3)最后再说如何配置Hibernate的二级缓存。缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。下面是缓存的伪代码:引出hibernate的第二级缓存,用下面的伪代码分析了Cache的实现原理。Dao{hashmap map =new map();User getUser(integer id){User user = map.get(id)if(user ==null){user = session.
-
Java面试题:Hibernate的二级缓存与Hibernate多表查询我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点。1、请介绍一下Hibernate的二级缓存解题按照以下思路来回答:(1)首先说清楚什么是缓存;(2)再说有了hibernate的Session就是一级缓存,即有了一级缓存,为什么还要有二级缓存;(3)最后再说如何配置Hibernate的二级缓存。缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。下面是缓存的伪代码:引出hibernate的第二级缓存,用下面的伪代码分析了Cache的实现原理。Dao{hashmap map =new map();User getUser(integer id){User user = map.get(id)if(user ==null){user = session.
-
My Hibernate学习手记一.Hibernate学习之表单映射 1.什么是ORM ORM(object / relationship /mapping):对象/关系映射 Hibernate是一种可行的ORM框架技术 2.Hibernate简介(开源) 3.Hibernate例子 (1)创建Hibernate的配置文件 Hibernate.cfg.xml (2)创建持久化类 (3)创建对象关系映射 (4)通过Hibernate-api编写访问数据库的代码 二.Hibernate进阶 4.Hibernate.cfg.xml常配置 (1) hibernate.show_sql 表示hibernate运行时将sql语句输出到控制台,编码便于测试。 (2) hibernate.forma
hibernate中间表相关课程
hibernate中间表相关教程
- 3. 没有中间表实体类的映射 如果中间表仅仅只是充当桥梁作用,没有程序需要的实质性数据时,程序中可以没有中间表对应的实体类。学生和课程的关系,直接在学生类和课程类中体现彼此关系就可以:新建课程实体类:@Entitypublic class Course { private Integer courseId; private String courseName; private String courseDesc; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer getCourseId() { return courseId; } //省略其它代码}因为一名学生对应多门课程,在学生实体类中添加集合属性:private Set<Course> courses;完成程序级别上的关系描述后,还需告诉 Hibernate,实体类中的集合属性数据来自哪一张以及如何获取?为了把问题简单化,在学生实体类中只体现和课程的关系 ,前面映射内容注释或删除。学生实体类的完整描述:private Set<Course> courses;@ManyToMany(targetEntity = Course.class)@JoinTable(name = "score", joinColumns = @JoinColumn(name = "stuId", referencedColumnName = "stuId"), inverseJoinColumns = @JoinColumn(name = "courseId", referencedColumnName = "courseId"))public Set<Course> getCourses() { return courses;}@ManyToMany 告诉 Hibernate, course 集合中的数据来自课程表 ;@JoinTable 告诉 Hibernate 获取课程表中数据时需要借助 score 中间表。分别描述中间表和学生表、课程表的连接字段。在 Hibernate 主配置文件中修改或添加如下信息:<property name="hbm2ddl.auto">create</property><mapping class="com.mk.po.Student" /><mapping class="com.mk.po.Course" />执行下面的测试实例:@Testpublic void testGetStuAndCourse() { HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>();}查看 MySql 中的表:切记把下面的信息修改回来:<property name="hbm2ddl.auto">update</property>手工添加测试数据:好!通过测试实例见证 Hibernate 的神奇。HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>();hibernateTemplate.template(new Notify<Student>() { @Override public Student action(Session session) { Student stu=(Student)session.get(Student.class, new Integer(1)); System.out.println("---------------------------"); System.out.println("学生姓名:"+stu.getStuName()); System.out.println("----------------------------"); System.out.println("学生选修课程数:"+stu.getCourses().size()); return stu;}});查看控制台上面的输出结果:Hibernate: select student0_.stuId as stuId1_1_0_, student0_.stuName as stuName2_1_0_, student0_.stuPassword as stuPassw3_1_0_, student0_.stuPic as stuPic4_1_0_, student0_.stuSex as stuSex5_1_0_ from Student student0_ where student0_.stuId=?---------------------------学生姓名:Hibernate----------------------------Hibernate: select courses0_.stuId as stuId1_1_1_, courses0_.courseId as courseId2_2_1_, course1_.courseId as courseId1_0_0_, course1_.courseDesc as courseDe2_0_0_, course1_.courseName as courseNa3_0_0_ from score courses0_ inner join Course course1_ on courses0_.courseId=course1_.courseId where courses0_.stuId=?学生选修课程数:2Hibernate 构建了两条 SQL 语句,先是查询到学生信息,需要课程信息时,再通过中间表连接到课程表,查询出课程相关信息。可得出结论:默认情况下,Hibernate 使用了延迟加载。如此做,Hibernate 是考虑了性能的。
- 3. 中间表 聊完了外键,我们来介绍本节的重点 —— 中间表。先引入一个场景,有两张数据表,分别是 imooc_user(用户表)和 imooc_class(课程表),对于用户来说,他(她)可以购买多门课程,而对于课程来说,它也可以被多个用户购买。这样就产生了一个难题,用户与课程之间是典型的多对多关系,因此我们需要另一张表(imooc_user_class)来记录用户与课程之间的购买关系。类似于 imooc_user_class 这样的关系表,我们称之为中间表。对于它们三者,我们可以这样设计(省略诸多字段信息):DROP TABLE IF EXISTS imooc_user;CREATE TABLE imooc_user( id int PRIMARY KEY, username varchar(20), age int);DROP TABLE IF EXISTS imooc_class;CREATE TABLE imooc_class( id int PRIMARY KEY, name varchar(50), description varchar(100));DROP TABLE IF EXISTS imooc_user_class;CREATE TABLE imooc_user_class( id int PRIMARY KEY, user_id int NOT NULL, class_id int NOT NULL);从 imooc_user_class 表的结构上看,它的主体其实就是一些外键的组合。这也是中间表与外键的关系。它们之间的关系如下图所示:
- 2.2 PO 之间映射表之间的关系 从编码层面上讲,就是如何在 Student 类 与 Address 类 之间体现出数据库表中数据之间的关系。先从 Student 类 中开始,在 Student 类 中添加一个属性字段。private Address address;address 属性是一个 Address 类类型,数据库不认得这玩意儿,Hibernate 表示开始要一个头两个大了,眩晕啦。null 你先进入学生表,然后根据学生表中的 addressId 进入到地址表,找到对应数据。Hibernate 又没有读心术,它如何知道你心里所想。所以,需要通过 XML 或注解语法把开发者的想法告诉 Hibernate:private Address address;@OneToOne(targetEntity = Address.class)@JoinColumn(name = "addressId")public Address getAddress() {return address;}@OneToOne 注解告诉 Hibernate :address 属性的值要麻烦您先找到 学生表的 addressId,再辛苦去一下 地址表,把对应的地址信息查询出来;@JoinColumn:告诉 Hibernate 带着 addressId 到地址表中查找。主配置文件中添加如下信息:<property name=*"hbm2ddl.auto"*>create</property><mapping class=*"com.mk.po.Student"* /><mapping class=*"com.mk.po.Address"* />在 Hibernate 创建完毕后,添加几条测试数据,操作完成后别忘记改回来。此处操作自动完成!相信聪明如你,一定没问题。<property name="hbm2ddl.auto">update</property>
- 2. Hibernate 中的隔离机制 如前面课程所述,隔离机制能保证事务之间的良好秩序,但是,太严格的隔离机制会让事务之间产生时间上的等待或延迟,也就是说并发性弱。太松散的隔离机制,虽然可以增加并发性,但可能会产生事务之间的数据脏读等一系列不希望出现的事情。有时,纯粹地依靠 JDBC 提供的 4 种隔离机制很难做到隔离的优雅性,所以,一般采用 读取已提交 或者 更低的事务隔离级别,再配合各种并发访问控制策略来达到并发事务控制的目的。Hibernate 中如何设置隔离机制?这个问题很简单,你要做的就是在 Hibernate 主配置文件中添加如下信息:<property name="connection.isolation">2</property>这里的 2 是什么意思?是这样的,Hibernate 使用 1 、2 、4 、8 这几个数字分别代表 4 种隔离机制。8 - Serializable 串行化;4 - Repeatable Read 可重复读;2 - Read Commited 可读已提交;1 - Read Uncommited 可读未提交。使用数字有几个好处,毕竟不用记那么一长串字符串,最主要的是,这几个数字可以换算成 二进制中的 0001、0010、0100、1000。可以直接通过二进制位运算的方式进行权限控制。设置就是这么简单,但是,这还不够。刚说过, 最好再配合并发控制策略。那么, Hibernate 提供了怎样的 策略,告诉你,有 2 种 “锁” 机制:乐观锁;悲观锁。你是喜欢先苦后甜还是先甜后苦了,我喜欢先苦后甜。好吧,先讲解什么是悲观锁。
- 3. Hibernate 中使用注解 Hibernate 中,通过元数据的方式描述映射关系,其表达语法有 2 种:其一: XML 语法;其二: 本节课程要给大家隆重推荐的是注解语法。注解语法本质就是 Java 语法。
- 2. Hibernate 是什么 简而言之:Hibernate 是一个 Java Jdbc 框架,用来简化 Java Jdbc 操作;Hibernate 也是一个ORM 框架,可以自动完成关系数据库中关系型数据到 Java 对象型数据的映射;当然,还可以说是一个持久化框架。以上说法其实是对完成同一件事情不同角度的诠释。Hibernate 的出现就是想让开发者的编码工作变得简单,这个简单指不需要在非核心逻辑编写上花费太多时间。
hibernate中间表相关搜索
-
h1
h6
hack
hadoop
halt
hana
handler
hanging
hash
hashtable
haskell
hatch
hbase
hbuilder
hdfs
head
header
header php
headers
headerstyle