hibernate 关系
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于hibernate 关系内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在hibernate 关系相关知识领域提供全面立体的资料补充。同时还包含 h6、hack、hadoop 的知识内容,欢迎查阅!
hibernate 关系相关知识
-
HibernateORM概念O:Object 对象R:Relation 关系 (关系型数据库)外键就是关系M:Mapping 映射关系型数据库,对应的有对象型数据库,比较少用。现在主流的是关系型数据库。MYSQL, Oracle...等都是关系型数据库。ORM解决什么问题?存储:能把对象的数据直接保存到数据库获取:能直接从数据库拿到一个对象要做到上面2点,必须要有映射。图片.pngHibernate和ORM的关系是什么?Hibernate实现了 ORM。ORM相当于是一种思想。比较好的hibernate博文:http://blog.csdn.net/jiuqiyuliang/article/details/39078749图片.png1.Hibernate 案例搭建一个Hibernate环境,开发步骤:1)下载源码:版本:hibernate-distribution-3.6.0.Final2)引入jar文件hibernate3.jar核心 + required 必须引入的(6个)+ jpa + 数据库
-
Hibernate【入门篇】tags: Hibernate 前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了! 什么是Hibernate框架? Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象! 为什么要使用Hibernate? 既然Hibernate是关于Java对象和关系数据库之间的联系的话,也就是我们MVC中的数据持久层->在编写程序中的DAO层... 首先,我们来回顾一下我们在DAO层写程序的历程吧: 在DAO
-
关于hibernate需要注意的东西在hibernate框架种,需要注意的是在myeclipse中有支持数据库连接的,只需要自己在工具中配置,而且在myeclpise也支持,hibernate核心配置文件的生成,包括工具类的生成等。当不懂,或忘记之时,请看hibernate之一对多的最后一章。 hibernate框架开发的几大重要步骤: 1、创建hibernate的配置文件 2、创建持久化类 3、创建对象--关系映射文件 4、通过hibernate api编写访问数据库代码 而对于我本人而言,或许对很多新手而言,我相信,框架配置方面,很快或者多用就会很熟悉,对于我们最重
-
Hibernate一对一关联关系介绍和简单demo开头说两句: Hibernate一对一关系分为两种: 1.主键关联一对一映射:例如在两个表a,b中,一个字段在a表中是主键,a表中的该字段级联b表中的字段,该字段在b表中作为主键,也就是当a表中该字段修改时,b表中的字段随之改变;通过<one-to-one>元素配置, 2.唯一外键关联一对一映射:一对多关系的一种特例,主键表对应实体类的配置文件中通过one-to-one元素配置。 在这里我说一下第一种情况,第二种情况就不再说明了,好了,我们开始做demo. demo介绍:有两个表,分别是register表和userInfo表
hibernate 关系相关课程
hibernate 关系相关教程
- 2. Hibernate 是什么 简而言之:Hibernate 是一个 Java Jdbc 框架,用来简化 Java Jdbc 操作;Hibernate 也是一个ORM 框架,可以自动完成关系数据库中关系型数据到 Java 对象型数据的映射;当然,还可以说是一个持久化框架。以上说法其实是对完成同一件事情不同角度的诠释。Hibernate 的出现就是想让开发者的编码工作变得简单,这个简单指不需要在非核心逻辑编写上花费太多时间。
- 2. 关系维系者 新学期开始了,同学们选择了各自喜欢的课程,现在为学生添加选修课程的任务就要落在 Hibernate 的身上。一起来看看 Hibernate 是如何完成这个任务。行动之前,先假设一个需求:“Hibernate” 同学觉得自己选修的课程太难了,现在想重新选择。重新选修之前,先删除原来选修的内容:执行流程分析:进入学生表,查询到 “Hibernate” 同学的信息;删除 “Hibernate” 同学的所有选修课程。
- 2.1 解除级联对象之间的关系 删除方式有两种:第一种解除方案HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>(); hibernateTemplate.template(new Notify<Student>() { @Override public Student action(Session session) { // 查询学生 Student student =(Student)session.get(Student.class, new Integer(1)); // 查询Java课程 Course javaCourse = (Course) session.get(Course.class, new Integer(1)); // 查询C课程 Course ccourse = (Course) session.get(Course.class, new Integer(2)); // 解除关系 student.getCourses().remove(javaCourse); student.getCourses().remove(ccourse); return null; } });查询到 ”Hibernate“ 同学的信息,注意,此时 student 对象处于持久化状态,意味着 student 对象在程序世界的行为可以同步到数据库中。查询 ”Hibernate“ 同学选修的 Java 和 C 两门课程,此时保存这两个课程信息的对象也处于持久化状态。使用如下代码解除学生和课程之间的关系:student.getCourses().remove(javaCourse);student.getCourses().remove(ccourse);因为学生对象、课程对象都处于持久化状态。它们在程序世界中的一言一行都会同步到数据库中。既然在程序世界解除了彼此之间的关系,在数据库中,中间表中的关系描述数据也会自动删除。从控制台上所显示出来的 SQL 语句其实也知道删除已经成功,这个就不贴出来了。进入 MySql 验证一下:中间表中已经不存在和 ”Hibernate“ 同学相关的课程信息。但是,此时你可能会有一个想法,刚刚是以学生对象为主动方,向课程对象提出了分手,那么,能不能以课程方为主动方提出分手呢?试一下便知,测试之前,先恢复原来的内容:执行下面的实例代码:HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>(); hibernateTemplate.template(new Notify<Student>() { @Override public Student action(Session session) { // Hiberante学生 Student student =(Student)session.get(Student.class, new Integer(1)); // 查询Java Course javaCourse = (Course) session.get(Course.class, new Integer(1)); // 查询C Course ccourse = (Course) session.get(Course.class, new Integer(2)); // 解除关系,以课程对象为主动方 javaCourse.getStudents().remove(student); ccourse.getStudents().remove(student); return null; } });可能会让你失望,这次操作对数据库没有任何影响。可见,分手只能是由学生对象提出来。虽然在前面课程中,咱们配置了学生类和课程类的双向多对多关联映射,但是,两者之间只能有一个主动方,这里要了解,所谓主动方,就是关系的维系者。关系的建立和解除只能由主动方提供。是不是有点像霸道总裁的狗血故事。第二种解除方案Ok!一起继续了解第 2 种方案。不管是哪种方案,切记,只能是由主动方提出分手。行事之前,一定要先检查数据是否存在。HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>(); hibernateTemplate.template(new Notify<Student>() { @Override public Student action(Session session) { // Hibernate学生 Student student =(Student)session.get(Student.class, new Integer(1)); //解除关系 student.getCourses().removeAll(student.getCourses()); return null; } });和第一种方案相比较,不再查询课程信息,由学生对象单方面一次性解除关系。student.getCourses().removeAll(student.getCourses()); return null;执行结果没有什么意外,程序世界中关系的解除操作同步到了数据库中。一起看看控制台上输出的信息: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: 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=?Hibernate: delete from score where stuId=?大家可以看到,Hibernate 接收到解除操作后,立即由中间表连接到课程表,把相关课程信息从中间表中抺出。一切进行得简单而有序:记住,持久化对象的行为可以同步到数据库中去;多对多双向关联映射中,有主动方和被动方一说。
- 3. Hibernate 中使用注解 Hibernate 中,通过元数据的方式描述映射关系,其表达语法有 2 种:其一: XML 语法;其二: 本节课程要给大家隆重推荐的是注解语法。注解语法本质就是 Java 语法。
- 2. Hibernate 核心组件 独木难成林,一个好汉三个帮!开发者的应用程序依赖 Hibernate 完成数据库中数据操作任务时,Hibernate 又会依靠它体系内的多个组件一起协同完成任务。如下图展示了 Hibernate 的核心组件库中部分组件之间的依赖关系。开发者需要使用 Hibernate 暴露给开发者的组件 API 进行对接开发,先看看分别都有谁:Configuration;ServiceRegistry;SessionFactory;Session;Transaction。这几大组件各有来头,想要完全驾驭,则需了解其秉性和功能,后面章节会一一展开讨论。此处只需要了解这几大组件在构建一个完整的操作流程时各自的核心作用及出现顺序。如下图示:简述一下流程:通过 Configuration 对象读取主配置文件,故需为此对象指定主配置文件的位置,如不指定,由从默认位置即编译后的主目录(classes 或 bin)中读取;配置对象在拥有了数据库连接配置信息后便可以创建 SessionFactory 对象。此组件可认为是应用程序中对某一个具体关系型数据库系统的抽象引用。透明地认为它就是数据库的镜像;由 SessionFactory 对象创建出可以直接操作数据库的会话对象(Session)。Session 对象相当于原生 Jdbc 中的 Connection 对象,但比其具有更丰富的实际操作功能,Session 对象也叫做持久化容器。应用程序主要使用此对象进行一系列具体的数据操作,有它便可“扫货”数据库中的数据;Transaction 在具体操作中起事务监控作用,负责及时提交,及时刹车回滚。认识了 Hibernate 中的这群肝胆相照的好兄弟,了解了他们的各自职责,它们通过分工合作的方式把应用程序的意图向 Hibernate 内部组件逐层传达。现在是着手编写一个完整代码的时候了,有了结果的过程更能感受到 Hibernate 的魅力。Hibernate 4.x 之后的版本中多了一个 ServiceRegistry组件,此组件到后面章节论述。
- 2.2 建立级联对象之间的关系 好!现在为 ”Hibernate“ 同学选修新的课程。比如说,想选择 DB 课程和 JAVA 课程。天呀,刚刚不是才解除了 JAVA 课程吗。你管得着吗,咱们就是这么任性,想解除就解除,想建立就建立 ,谁叫 Hibernate 这么方便呢。有了前面的知识,应该难不倒我们了。现在来看看 Hibernate 实例:HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>(); hibernateTemplate.template(new Notify<Student>() { @Override public Student action(Session session) { // 添加新学生 Student student =(Student)session.get(Student.class, new Integer(1)); // 查询Java Course javaCourse = (Course) session.get(Course.class, new Integer(1)); // 查询C Course dbCourse = (Course) session.get(Course.class, new Integer(3)); // 确定关系 student.getCourses().add(javaCourse); student.getCourses().add(dbCourse); return null; } });关系还是在程序中直接体现,并且是由学生对象维护。可以进入数据库,查看一下:还是再叮嘱一下,关系只能由学生方维护的。此处,应该有疑问,为什么只能是学生方,而不能是课程方,难道在 Java 的世界里也有命运一说。这个命运的安排是由开发者来决定的,在进行关联注解时,那一方使用了 mappedBy 属性,则这一方就是被动方,很好理解,这个属性本身的含义就是说,听对方的。所以说,谁是霸道总裁,看开发者的心情。理论上讲,多对多中,两者应该是平等关系。刚刚的解除和重新建立都是对已经存在的学生进行的。如果班里转来了一名叫 ”HibernateTemplate“ 的新学生,他想选修 JAVA 和 DB,则应该怎么操作呢?很简单啊!学生没有,添加就是;课程信息有,从表中查询就是;关系不存在,建立就是。下面便是如你所想的实例代码:HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>();hibernateTemplate.template(new Notify<Student>() { @Override public Student action(Session session) { // 添加新学生 Student student = new Student("HibernateTemplate", "男"); // 查询Java课程 Course javaCourse = (Course) session.get(Course.class, new Integer(1)); System.out.println(javaCourse.getCourseName()); // 查询DB课程 Course dbCourse = (Course) session.get(Course.class, new Integer(3)); System.out.println(dbCourse.getCourseName()); // 确定关系 student.getCourses().add(javaCourse); student.getCourses().add(dbCourse); return null; }});是的,这个代码本身没有问题。但是,这里会有一个小坑,这个坑没有填的话,你可能会测试不成功。在学生类中,一定要记住对下面的属性进行实例化:private Set<Course> courses=new HashSet<Course>();否则就会有空指针异常抛出来。前面没有,是因为数据库中有数据,Hibernate 帮咱们自动实例化了。但现在是一个新学生,Hiberante 可不会帮你实例化他的课程集合属性。也就是不能任何时候都依靠 Hibernate,它也有顾全不到的地方。为了让你宽心,还是看一下数据库中数据吧:
hibernate 关系相关搜索
-
h1
h6
hack
hadoop
halt
hana
handler
hanging
hash
hashtable
haskell
hatch
hbase
hbuilder
hdfs
head
header
header php
headers
headerstyle