hibernate一对多配置
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于hibernate一对多配置内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在hibernate一对多配置相关知识领域提供全面立体的资料补充。同时还包含 h6、hack、hadoop 的知识内容,欢迎查阅!
hibernate一对多配置相关知识
-
hibernate中多对多相关配置平常生活中多对多的情况很常见,如一个老师有多个学生,一个学生也有多个老师,对于这种较复杂的情况,在hibernate中完成持久化时也比其他的情况稍有复杂。下面进行相关的说明。 1、学生实体类: public class Student { private int id; private String name; private String sex; private int grade; private Set<Teacher> teachers;//一个学生可以有多个老师 //下面一些get/set方法 } 2、老师实体类: public class Teacher { private int id; private Strin
-
Hibernate中关于一对多的实例配置在hibernate中实现一对多的关联映射。 1、多的一方实体类: public class Book { private int id; private String bookName; private String bookAuthor; private double bookPrice; private Poet poet;//一的一方,在多的一方需要维护一个一的一方的引用。 /** 这下面为get/set方法 */ } 2、一的一方实体类: private int id; private String name; private int age; private Set<Book> book = new HashSet<>();//需要将多的一方直接创建出来。使用泛
-
Hibernate框架第一天 orm思想与配置文件的环境搭配1 web内容回顾 2 hibernate概述 3 hibernate入门案例 4 hibernate的配置文件 5 hibernate的核心api Javaee三层结构 1 web层:struts2 2 service层:spring 3 dao层:hibernate (1)对数据库进行crud操作 MVC模式 1 M : 模型 2 V: 视图 3 C: 控制器 Hibernate的概述 什么是框架 1 框架帮我们实现了一部分功能,少写一部分代码 什么是hibernate框架 1 hibernate框架应用在javaee三层结构中dao层框架 2 hibernate框架底层就是jdbc,对jdbc进行封装,使用hi
-
hibernate连接数据库配置1.连接mySql,文件配置如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.url"> jdbc:m
hibernate一对多配置相关课程
hibernate一对多配置相关教程
- 3. Hibernate 的主配置文件 聊回到 Hibernate,Hibernate 是一个框架,框架只是一个半成品应用程序。需要使用 Hibernate 完成一次具体的数据库数据操作时,需要开发者的组件和 Hibernate 的组件通力合作。对于 Hibernate 来说,如何知道开发者具体使用什么样的数据库、什么样的持久化对象……开发者只需要把这些信息写入到配置文件中,Hibernate 就能通过读取配置信息了解开发者的心意。所以说主配置文件在 Hibernate 和 开发者之间充当了桥梁的作用,是内外交流的通道。Tips: 通过配置文件,在开发者和 Hibernate 之间进行信息传递,让 Hibernate 能从容面对不同开发者的需求。你有没有觉得 Hibernate 把开闭原则用得很好呢!知道了配置文件的作用,现在是时候了解 Hibernate 中的主配置文件能具体传递什么信息了。
- 2. 一对多关联映射 关系型数据库中表与表中的数据存在一对多(或多对一)关系。如学生表、班级表。一个班级有多个学生,多个学生可以在同一个班级。一对多或多对一本质上是一样的,如同一块硬币的正面和反面,只是看待事物的角度不同而已。数据库中有学生表、班级表。使用 Hibernate 进行数据操作时, 程序中就应该有学生类、班级类。同时学生类、班级类应该使用 OOP 语法描述出如同学生表和班级表一样的关系。并且还要让 Hibernate 看得懂。有了前面的基础,直接上代码:创建班级类:@Entitypublic class ClassRoom { private Integer classRoomId; private String classRoomName; private String classRoomDesc; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer getClassRoomId() { return classRoomId; }需求:查询学生时,得到学生所在班级信息。进入学生类,添加如下代码,描述学生类和班级类的关系:private ClassRoom classRoom;除此之外,还需要让 Hibernate 知道,这个对象属性的值来自于班级表中的对应数据,进一步修改代码:private ClassRoom classRoom;@ManyToOne(targetEntity=ClassRoom.class)@JoinColumn(name="classRoomId")public ClassRoom getClassRoom() { return classRoom;}@ManyToOne 告诉 Hibernate,从学生的角度来看,学生是多的一边,查询班级表可以得到学生所在班级信息。@JoinColumn 告诉 Hibernate 需要带着指定的字段值到班级表中匹配数据。修改 Hibernate 主配置文件中内容:<property name="hbm2ddl.auto">create</property><mapping class="com.mk.po.Student" /><mapping class="com.mk.po.ClassRoom" />为了让事情变得简单明了,在主配置文件中只保留学生类和班级类的映射关系。学生类中的所有属性描述:private Integer stuId; private String stuName; private String stuSex; private String stuPassword; private Blob stuPic; private ClassRoom classRoom; @ManyToOne(targetEntity=ClassRoom.class) @JoinColumn(name="classRoomId") public ClassRoom getClassRoom() { return classRoom; }使用上一节课的模板对象跑一个空测试实例:@Testpublic void testGetByTemplate() { HibernateTemplate<Student> hibernateTemplate=new HibernateTemplate<Student>(); }目的是让 Hibernate 重新创建学生表、班级表。别忘记啦,自动创建表后,修改回:<property name="hbm2ddl.auto">update</property>进入 MySql,在学生表、班级表中手工添加几条测试数据:到了完成需求的时候,测试下面实例: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("学生姓名:"+stu.getStuName()); System.out.println("学生所在班级:"+stu.getClassRoom().getClassRoomName()); return stu_; } });控制台输出结果:Hibernate: select student0_.stuId as stuId1_1_1_, student0_.classRoomId as classRoo6_1_1_, student0_.stuName as stuName2_1_1_, student0_.stuPassword as stuPassw3_1_1_, student0_.stuPic as stuPic4_1_1_, student0_.stuSex as stuSex5_1_1_, classroom1_.classRoomId as classRoo1_0_0_, classroom1_.classRoomDesc as classRoo2_0_0_, classroom1_.classRoomName as classRoo3_0_0_ from Student student0_ left outer join ClassRoom classroom1_ on student0_.classRoomId=classroom1_.classRoomId where student0_.stuId=?学生姓名:Hibernate学生所在班级:c1911Hibernate 使用 left outer join 构建了一条多表查询语句!
- 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.1 可配置内容 最小需求配置信息:Hibernate 运行的底层信息:数据库的 URL、用户名、密码、JDBC 驱动类,数据库 Dialect, 数据库连接池等;Hibernate 映射文件(*.hbm.xml)或注解类位置。配置信息远不止上面这些,如缓存信息、事务信息……主配置文件是开发者和 Hibernate 心灵相连的接口,要让程序在生产环境中工作,需要交流的地方多了。前面在主配置文件中出现的信息就不再啰嗦!下面罗列部分配置信息内容!不要指望全部记住!!!!属性名用途 Hibernate.dialect 针对特定的关系数据库生成优化的 SQLHibernate.format_sql 格式化输出 SQL 语句(true,false)Hibernate.default_schema 将给定的 schema/tablespace 附加到表名上(schema name)Hibernate.hbm2ddl.auto 自动构建数据库结构,通过映射生成 DDL 语句。create-drop: 运行时,先创建,运行完,再删除create: 每次运行前都会删除已存在的再创建。 测试时,可以使用 createHibernate.cache.use_query_cache 允许查询缓存,个别查询仍然需要被设置为可缓存的 Hibernate.cache_user_second_level_cache 禁止使用二级缓存,对于在映射中定义中指定的类,会默认开启二级缓存 Hibernate.cahce_query_cache_factory 自定义实现 querycache 接口的类名,默认为内建的 standardQueryCacheHibernate 主配置文件的格式Hibernate 提供了一个与配置文件有关的 Configuration 组件,它的功能是:找到配置文件,读取配置文件内容;告诉 Hibernate 应该如何响应开发者的请求。Hibernate 提供有 2 种配置文件格式,格式不同 Configuration 读取时也稍有差异性。属性文件(hibernate.properties)格式:在实例化 Configuration 组件时,Hiberntae 指定的默认配置文件; Configuration cfg = new Configuration();XML 文件(hibernate.cfg.xml)格式:需要显示调用 Configuration 组件的 configure()方法,此方法不带参数时,默认会从 classpath 下寻找是否存在 hibernate.cfg.xml 文件。 Configuration cfg = new Configuration().configure();hibernate 官方建议使用 Hibernate.cfg.xml 作为主配置文件名,当然完全可以修改成自己喜欢的名字,修改后读取时则需要使用 Configuration 组件中提供的带参数的 configure()方法。public Configuration configure(String resource) throws HibernateException ;建议初学者不要轻易改动。
- 2. 读取配置信息 简易框架主要模拟 3 个组件,分别对应 Hibernate 中的 Configuration、SessionFactory、Session 组件。Configuration 组件的作用:解析配置文件中的信息。Tips: 简易框架中,保持配置文件格式及内容和 Hiberante 的主配置文件一致。查看一下 Configuration 类的结构:public class Configuration { //保存配置文件中的 property 元素信息 private Map<String,String> pros; //保存配置文件中的映射类 private List<String> mappings; public Configuration() { this.pros=new HashMap<String, String>(); this.mappings=new ArrayList<String>(); } /** * 读取配置文件 */ public void configure() throws DocumentException { configure("/hibernate.cfg.xml"); } private void configure(String resource) throws DocumentException { InputStream stream =Configuration.class.getResourceAsStream(resource); doConfigure( stream); } /** * 使用 DOM4j XML 解析器解决配置文件中的信息 */ private void doConfigure(InputStream stream) throws DocumentException { SAXReader saxReader=new SAXReader(); Document doc= saxReader.read(stream); Element rootEle= doc.getRootElement(); Element sfEle= rootEle.addElement("session-factory"); List<Element> propertys= sfEle.elements("property"); for (Element ele : propertys) { this.pros.put(ele.attributeValue("name"), ele.getText()); } List<Element> mappings= sfEle.elements("mapping"); for (Element m : mappings) { this.mappings.add(m.attributeValue("class")); } } /** *创建会话工厂 * */ public SessionFactory buildSessionFactory() { return new SessionFactory(this.pros,this.mappings); }}Hibernate 的主配置文件中有很多配置项,因受限于文章篇幅和本文初设目标,这里只解析 2 类信息:数据库连接信息;实体类路径信息。基础好的学习者可以查阅 Hibernate 的源代码。
- 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组件,此组件到后面章节论述。
hibernate一对多配置相关搜索
-
h1
h6
hack
hadoop
halt
hana
handler
hanging
hash
hashtable
haskell
hatch
hbase
hbuilder
hdfs
head
header
header php
headers
headerstyle