hibernate的映射
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于hibernate的映射内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在hibernate的映射相关知识领域提供全面立体的资料补充。同时还包含 h6、hack、hadoop 的知识内容,欢迎查阅!
hibernate的映射相关知识
-
Hibernate【映射】知识要点(3)在Hibernate入门篇讲解配置的时候,在generator节点下还有一个属性没有讲解,也就是foreign属性...现在来填坑了.. idCard映射文件 idCart的映射文件主要在于:将主键也映射成外键来使用,这就需要用到foreign属性值了 使用<one-to-one>标签来配置基于主键的映射 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="zhongfucheng.on
-
Hibernate第九篇【组件映射、继承映射】前言 到目前位置,我们已经学习了一对一、一对多、多对一、多对多映射了...既然Hibernate是ORM实现的框架,它还提供了组件映射和继承映射..本博文主要讲解组件映射和继承映射 Java主要的类主要有两种方式 组合关系,组合关系对应的就是组件映射 继承关系,继承关系对应的就是继承映射 组件映射 组件映射实际上就是将组合关系的数据映射成一张表,组件类和被包含的组件类映射成一张表 有的时候,两个类的关系明显不是继承关系,但两个类的亲密程度很高,在一个类里边需要用到另外一个类...
-
Hibernate 一对多双向映射及乐观锁使用Hibernate 一对多双向映射及乐观锁使用 在“Hibernate关联关系映射实例速查”一文中,通过myeclipse5.5,快速做出了Hibernate各种映射的示例。时隔快一年了,但是还是有博友向我索要工程源码,很遗憾的是已经找不到了。但找到一了一个测试代码:对双向关联和乐观锁的测试。其实映射类型很多,搞清楚一对多,基本上所有的映射就搞明白了,一对一也是一对多的特例而已,多对多也可以转换为一对多和多对一,并且实际中很少用到多对多。 还是老规矩,因为是测试,代码几乎全部是myeclipse生成的,我稍作了修改。并且应博友“阿飞”的留言,我做了详细的注释。 例子两部分:1、一对多双向映射:模型是“班级-学生”模型。两个实体分别是Tclass和Student。2、乐观锁的是使用,版本分别使用递增整数和时间戳。两个实体分别是Foo和Bar。 Tclass实体及其映射:public class Tclass implements java.io.Serial
-
Hibernate初探之单表映射hibernate: 什么是ORM? ORM(Object/Relationship Mapping):对象/关系映射 利用面向对象思想编写的数据库应用程序,最终都是把对象信息保存在关系型数据库中,于是要编写很多和底层数据库相关的SQL语句。 明显和面向对象是格格不入的。 使用ORM的好处是什么? 方便我们程序员,用面向对象的思想,在项目当中尽量的少写,和底层数据库相关的sql语句。也即是方便我们程序的维护、修改、跨平台性、扩展。 用ORM就为什么要用Hibernate? 是JAVA技术里面的,一款成熟稳定的ORM框架。 写
hibernate的映射相关课程
-
学会Kotlin 突破开发语言瓶颈 此课程以Kotlin1.3.X版本为基础,带你构建Kotlin知识体系。无论对Android开发还是后端开发工程师,都是开发工作中的好帮手。
讲师:bennyhuo 中级 1474人正在学习
hibernate的映射相关教程
- 2. 继承映射 学习继承映射之前,需要搞清楚什么是继承映射?继承是 OOP 中的概念,其目的除了复用代码之外,还用来描述对象在现实世界中的关系。为了更好地讲解继承映射,咱们再在数据库中创建一张老师表。数据库中多了一张表,按照使用 Hibernate 的套路,理所当然应该在程序中添加一个老师类。@Entitypublic class Teacher { private Integer teacherId; private String teacherName; private Integer serviceYear; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer getTeacherId() { return teacherId; } //省略其它……}从 OOP 的角度进行分析,可以为学生类和老师类创建一个共同的父类,描述两者共同的属性。所以,你会看到如下 3 个类型:public class Person implements Serializable {}public class Teacher extends Person implements Serializable {}public class Student extends Person implements Serializable {}程序中通过 OOP 继承语法重新描述了学生类和老师类的关系,程序中结构上的变化,必然会让 Hibernate 茫然不知所措,因为关系型数据库中是没有继承一说的。此时,就需要告诉 Hibernate 如何把程序中的继承关系映射到数据库中。这就叫做继承映射!
- 3.2 XML 映射 现在流行使用注解方式告诉 Hibernate 你操作的对象对应数据库中的那张表及更多关联信息。对 XML 映射大家也需要了解一下,万一你以后工作的企业里有一群怀旧的叔叔呢!本章节中的案例使用 XML 映射方式,后面的内容讲解还是要跟上潮流,使用注解方式。命名为 Student.hbm.xml 文件中部分内容如下 (完整的文档结构说明可查看官方文档):<Hibernate-mapping> <class name="com.po.Student" table="student" schema="scott" > <id name="stuId" type="java.lang.Integer"> <column name="stuId" precision="11" scale="0" /> <generator class="increment"></generator> </id> <property name="stuName" type="java.lang.String"> <column name="stuName" length="20" unique="true" /> </property> <!--其它属性映射--> </class></Hibernate-mapping>上面这个 XML 文件中的内容,语义上非常明确。为了加深理解,再解释一下 Xml 中相应元素:class: 类与表的映射关系;id: 类中的那个属性对应表中的主键字段,只能有一个。这个属性也可叫做标识属性。property: 通过子元素 column 一起说明类中的其它属性分别对应表中的那个字段,可以有多个。通过 XML 元素属性或子元素所提供的附加信息越多,就可以让 Hibernate 清晰地明白自己的任务,否则某些环节它就要靠猜了!编码规范提示: 尽可能保持 Java 类中属性命名和表中字段命名相同!有了前面的工作。已经足够让 Hibernate 在进入数据库系统时生成正确的 SQL 语句,也足够让 Hibernate 把从数据库中带出来的数据映射成正确 Java 对象。
- 5. 映射器 映射器的作用就是检查用户的请求路径中是否存在对应的控制器组件。Tips: 有点类似于导购员。客户报一个商品名,然后告诉你真正的商品所在位置。使用 Spring MVC 时,如果开发者没有显示配置映射器,Spring MVC 会启动默认的映射器组件。在 DispatcherServlet 所在包的根目录下有名为 DispatcherServlet.properties 的文件,已经配置了很多默认组件信息,开发者不用做任何配置,便能启动这些组件工作。打开此文件可以看到有 2 种类型的映射器信息:org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\ org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping这两个映射器分别为哪一种请求寻找控制器了?回答这个问题之间,先了解用户控制器的映射方式。前面提到可使用 @RequestMapping 注解对外映射控制器组件。其实 Spring MVC 还可以使用 @Bean 注解实现相同的功能 。先假设存在如下的控制器:public class HelloAction { public String hello() implements Controller{ System.out.println("hello"); return "hello"; }}@Bean 注解映射: 打开项目中的 WebConfig 配置类,添加如下代码; @Bean(name = "/hello") public HelloAction hello() { return new HelloAction(); }Tips: “hello” 前面一定要加上 “/” 。如果使用 @Bean 注解的方式映射控制器,则用户控制器需要实现 org.springframework.web.servlet.mvc.Controller 接口, 意味着必须是一个标准的控制器。此处的 @Bean 的作用就是告诉 Spring MVC:你要创建它,其名字被当成一个访问控制器的 URL。BeanNameUrlHandlerMapping 映射器的功能就是查找有没有哪一个 Bean 的名字和用户请求的路径相匹配。RequestMappingHandlerMapping 映射器就是查找由 @RequestMapping 注解映射的控制器。无论使用这 2 种映射器的哪一种,理论上都无需显示配置。Spring 会根据你的请求信息选择对应的映射器。显然,使用 @RequestMapping 映射更直接、可观。所以,RequestMappingHandlerMapping 映射器使用的更多。
- 3. 双向一对多关联映射 需求:查询班级时,想知道班上有多少名学生,又应该如何映射?进入班级类,添加如下属性:private Set<Student> students;使用集合属性 students,描述了一个班有多名学生。为什么使用 Set 集合?因为一个班级内不可能出现两个完全相同的学生对象。这还仅仅只是 OOP 层面上的关系,还需要告诉 Hibernate 应该如何填充数据。添加下面代码:private Set<Student> students;@OneToMany(targetEntity=Student.class,mappedBy="classRoom")public Set<Student> getStudents() { return students;}@OneToMany:很直白的说明了一个班级会有多名学生,指引 Hibernate 在填充数据时,要找到所有学生,别遗漏了;属性 mappedBy=“classRoom”: 告诉 Hibernate,班级和学生之间的关系在学生类中已经说的够明白了,应该不需要再废话了吧。OK!把前面的测试实例改为查询班级信息:HibernateTemplate<ClassRoom> hibernateTemplate = new HibernateTemplate<ClassRoom>(); hibernateTemplate.template(new Notify<ClassRoom>() { @Override public ClassRoom action(Session session) { ClassRoom classRoom=(ClassRoom)session.get(ClassRoom.class, new Integer(1)); System.out.println("班级名称:"+classRoom.getClassRoomName());System.out.println("------我是分隔线------------------------"); System.out.println("班级学生人数:"+classRoom.getStudents().size()); return classRoom; } });查看控制台输出结果:Hibernate: select classroom0_.classRoomId as classRoo1_0_0_, classroom0_.classRoomDesc as classRoo2_0_0_, classroom0_.classRoomName as classRoo3_0_0_ from ClassRoom classroom0_ where classroom0_.classRoomId=?班级名称:c1911------我是分隔线------------------------Hibernate: select students0_.classRoomId as classRoo6_0_1_, students0_.stuId as stuId1_1_1_, students0_.stuId as stuId1_1_0_, students0_.classRoomId as classRoo6_1_0_, students0_.stuName as stuName2_1_0_, students0_.stuPassword as stuPassw3_1_0_, students0_.stuPic as stuPic4_1_0_, students0_.stuSex as stuSex5_1_0_ from Student students0_ where students0_.classRoomId=?班级学生人数:2会发现一个很有意思的地方。Hibernate 查询班级时,构建了两条 SQL。先查询班级,当需要学生信息时,才构建查询学生的 SQL。大家应该也猜出来了,当从学生表查询班级表时,Hibernate 采用的是立即策略。当查询从班级表查询到学生表时,Hibernate 采用的是延迟加载策略。采用延迟加载都只有一个目的,需要时加载,提高响应速度。现在,学生类和班级类的映射配置信息,能让 Hibernate 自动从学生表查询到班级表,也能从班级表查询到学生表。这种 2 个实体类中的映射关系就称为双向一对多关联映射。无论是 @ManyToOne 还是 @OneToMany 注解都有 fetch 属性,可以设置的值有 2 个选择:FetchType.EAGERFetchType.LAZY。所以,在双向一对多关联映射可以选择是否启用延迟加载,这和一对一关联映射中是一样的,就不在此重复复述。是否采用延迟加载,由项目逻辑决定。
- 3. 关联映射中的延迟加载 关联多表查询时可选择是否启用延迟加载。PO 之间的映射,意味着 Hibernate 不仅能查询到指定表中数据,还能查询相关联表中的数据。但,有时只需要查询学生基本信息,并不需要地址信息,或者地址信息并不需要马上查询出来,能不能告诉 Hibernate,只查询学生信息,暂且别查询地址信息。同样,有时只需要查询所在地址,并不关心地址对应学生信息。可以启动关联映射中的延迟加载实现上面的需求。学生类中修改代码如下:@OneToOne(targetEntity = Address.class,fetch=FetchType.LAZY)@JoinColumn(name = "addressId")public Address getAddress() { return address;}@OneToOne 注解有 fetch 属性,为枚举类型,其值可选择:FetchType.LAZY;FetchType.EAGER。其作用便是告诉 Hibernate,是否延后或立即查询相关联表中的数据。执行下面测试代码:try { transaction = session.beginTransaction(); Student stu = (Student) session.get(Student.class, new Integer(1)); System.out.println("----------------学生信息---------------"); System.out.println("学生姓名:" + stu.getStuName()); transaction.commit();} catch (Exception e) { transaction.rollback();} finally { session.close();}查看结果:Hibernate: select student0_.stuId as stuId1_1_0_, student0_.addressId as addressI6_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 只构建了一条简单的 Sql 语句, 用于查询学生信息。继续执行下面测试实例:try { transaction = session.beginTransaction(); 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.getAddress().getAddressName()); transaction.commit();} catch (Exception e) { transaction.rollback();} finally { session.close();}输出结果:Hibernate: select student0_.stuId as stuId1_1_0_, student0_.addressId as addressI6_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 address0_.addressId as addressI1_0_0_, address0_.addressName as addressN2_0_0_, address0_.descript as descript3_0_0_ from Address address0_ where address0_.addressId=?学生家庭地址:北京Hibernate 分别构建了 2 条简单的查询 Sql 语句,可得出结论:只有当需要获取地址信息时,才会构建 Sql 语句查询地址表;这就是关联映射中的延迟加载。@OneToOne 默认情况下是采用立即策略,通过构建多表查询语句一次性全部查询。
- 5. 双向多对多映射 前面实现了学生查询到课程,如何在查询课程时,查询到学生信息。很简单,在课程 PO 中,添加学生集合属性: // 学生信息 private Set<Student> students;同样使用 @ManyToMany 注解告诉 Hibernate 数据源头及查询方法:private Set<Student> students;@ManyToMany(targetEntity = Student.class, mappedBy = "courses")public Set<Student> getStudents() { return students;}执行下面的测试实例:HibernateTemplate<Course> hibernateTemplate = new HibernateTemplate<Course>();hibernateTemplate.template(new Notify<Course>() { @Override public Course action(Session session) { Course course=(Course)session.get(Course.class, new Integer(1)); System.out.println("---------------------------"); System.out.println("课程名称:"+course.getCourseName()); System.out.println("----------------------------"); System.out.println("选修此课程的学生数:"+course.getStudents().size()); return course; }});控制台输出结果:Hibernate: select course0_.courseId as courseId1_0_0_, course0_.courseDesc as courseDe2_0_0_, course0_.courseName as courseNa3_0_0_ from Course course0_ where course0_.courseId=?---------------------------课程名称:java----------------------------Hibernate: select students0_.courseId as courseId2_0_1_, students0_.stuId as stuId1_2_1_, student1_.stuId as stuId1_1_0_, student1_.stuName as stuName2_1_0_, student1_.stuPassword as stuPassw3_1_0_, student1_.stuPic as stuPic4_1_0_, student1_.stuSex as stuSex5_1_0_ from score students0_ inner join Student student1_ on students0_.stuId=student1_.stuId where students0_.courseId=?选修此课程的学生数:2同样,Hibernate 采用的是延迟加载模式。先查询课程信息,当开发者需要学生信息时,才构建一条利用中间表进入学生表的 SQL 查询到学生信息。可通过学生表查询到课程表 ,也能从课程表查询到学生表,这种多对多关联映射称为双向映射关联。
hibernate的映射相关搜索
-
h1
h6
hack
hadoop
halt
hana
handler
hanging
hash
hashtable
haskell
hatch
hbase
hbuilder
hdfs
head
header
header php
headers
headerstyle