hibernate映射
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于hibernate映射内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在hibernate映射相关知识领域提供全面立体的资料补充。同时还包含 h6、hack、hadoop 的知识内容,欢迎查阅!
hibernate映射相关知识
-
Hibernate【映射】知识要点(2)解除关联关系 部门和员工是存在外键的联系的,我们接下来看看inverse属性对于解除关联关系有没有影响 当部门一方有权限时,即inverse属性为false //查找部门id为1的信息 Dept dept1 = (Dept) session.get(Dept.class, 1); //清除关联信息 dept1.getSet().clear(); 可以解除关联关系,employee的外键字段被设置为NULL了 当部门一方没有权限时,即inverse属性为true //查找部门id为2的信息 Dept dept1 = (Dept) session.get(Dept.class, 2); //清除关联信息 dept1.getSet().
-
Hibernate【映射】知识要点(1)前言 前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的...因此,本博文主要讲解关联映射 集合映射 需求分析:当用户购买商品,用户可能有多个地址。 数据库表 我们一般如下图一样设计数据库表,一般我们不会在User表设计多个列来保存地址的。因为每个用户的地址个数都不一的,会造成数据冗余 创建两张数据表,一张保存着用户的信息,一张保存着地址的信息。地址表使用外键来引用用户表 实体 由于地址只是使用String类型来保存着,那么我们直接使用一个User对象
-
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 映射枚举(Enum) 类型的属性在数据库中我们一般用整数或字符串来表示枚举值(有些数据库(如 MySQL)本身带有枚举类型), 而在使用 Hibernate 时实体对象中也用 Integer 或 String 来表示枚举就不那么友好了。试想来我们这样定义实体对象的两个属性@Entitypublic class User { .... public Integer type; //0: Individual 类型,1: Company 类型 public String gender; //可取值 Male 和 Female}这样的定义很不严谨,type 和 gender 理论上可取任何值,这会造成表中数据的混乱。其实 Hibernate 在 Java 实体对象中是可以直接用枚举类型与数据库中的整数或字符串映射,需用到 @Enumerated 注解
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。所以,在双向一对多关联映射可以选择是否启用延迟加载,这和一对一关联映射中是一样的,就不在此重复复述。是否采用延迟加载,由项目逻辑决定。
- 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 查询到学生信息。可通过学生表查询到课程表 ,也能从课程表查询到学生表,这种多对多关联映射称为双向映射关联。
- 5.2 映射 关于映射中间操作,有下面几个常用方法:map(Function f):接收一个方法作为参数,该方法会被应用到每个元素上,并将其映射成一个新的元素;mapToDouble(ToDoubleFunction f):接收一个方法作为参数,该方法会被应用到每个元素上,产生一个新的DoubleStream;mapToLong(ToLongFunction f):接收一个方法作为参数,该方法会被应用到每个元素上,产生一个新的LongStream;flatMap(Function f):接收一个方法作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。请查看如下实例:1257运行结果:PHP JS PYTHON JAVA可参考下图,理解映射的过程:
hibernate映射相关搜索
-
h1
h6
hack
hadoop
halt
hana
handler
hanging
hash
hashtable
haskell
hatch
hbase
hbuilder
hdfs
head
header
header php
headers
headerstyle