一对一hibernate
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于一对一hibernate内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在一对一hibernate相关知识领域提供全面立体的资料补充。同时还包含 yum、压缩工具、依赖关系 的知识内容,欢迎查阅!
一对一hibernate相关知识
-
myeclipse试用小记----Hibernate多对一双向关联(2)myeclipse试用小记----Hibernate多对一双向关联(2) 在上篇文章“myeclipse试用小记----Hibernate多对一单向关联(1)”中,讲到了“Hibernate多对一单向关联”,现在我打算把这个做成双向的,也就是多对一双向关联,看看myeclipse是如何实现的。 环境、数据库还和上篇文章的一样。只是表中的数据清空了。 注意:对于有外键的表,清空数据有两种方法:第一是先drop掉外键约束后,进行清除。第二种是先清除从表数据(orders),然后清除主表的数据(customers),具体我及不说了,有空我在写写数据库外键约束的方面的文章,这点也很重要的。 步骤1、清除orders、customers两表数据。2、用myeclipse新建web工程sx_d2y,加入hibernate支持。3、同时选中orders、customers生成实体Bean和mapping文件,并对mapping做小的改动。4、写两个测试类,分别保存Orders对象和
-
Hibernate 一对多双向映射及乐观锁使用Hibernate 一对多双向映射及乐观锁使用 在“Hibernate关联关系映射实例速查”一文中,通过myeclipse5.5,快速做出了Hibernate各种映射的示例。时隔快一年了,但是还是有博友向我索要工程源码,很遗憾的是已经找不到了。但找到一了一个测试代码:对双向关联和乐观锁的测试。其实映射类型很多,搞清楚一对多,基本上所有的映射就搞明白了,一对一也是一对多的特例而已,多对多也可以转换为一对多和多对一,并且实际中很少用到多对多。 还是老规矩,因为是测试,代码几乎全部是myeclipse生成的,我稍作了修改。并且应博友“阿飞”的留言,我做了详细的注释。 例子两部分:1、一对多双向映射:模型是“班级-学生”模型。两个实体分别是Tclass和Student。2、乐观锁的是使用,版本分别使用递增整数和时间戳。两个实体分别是Foo和Bar。 Tclass实体及其映射:public class Tclass implements java.io.Serial
-
Hibernate一级缓存测试分析Hibernate 一级缓存测试分析Hibernate的一级缓存就是指Session缓存,此Session非http的session会话技术,可以理解为JDBC的Connection,连接会话,Session缓存就是一块内存空间,用来存放相互管理的java对象,在使用Hibernate查询对象的时候,首先使用对象的OID(Object ID)在Hibernate 的一级缓存空间进行查找,如果通过OID匹配到了对象,就直接从一级缓存中取出使用,如果没有找到匹配该OID值的对象,这才会进行查询数据库。当从数据库中查询数据的时候,该数据就会被放入到Session缓存中,目的就是为了减少数据库的访问次数,从而提高性能。Hibernate缓存特点当应用程序调用Session接口的 save(), update(), saveOrUpdate() 时候,如果缓存中没 有相应的对象,Hb就会自动的把查询信息加入到缓存。当应用程序调用Session接口的 load(), get(), list() 等查询方法的时候,会进行
-
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 进行数据操作时, 程序中就应该有学生类、班级类。同时学生类、班级类应该使用 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。所以,在双向一对多关联映射可以选择是否启用延迟加载,这和一对一关联映射中是一样的,就不在此重复复述。是否采用延迟加载,由项目逻辑决定。
- 4. Hibernate 与 MyBatis 对比 Hibernate 和 MyBatis 是 Java 中使用最为广泛的两个 ORM 框架,二者各有千秋,我们将它们对比并总结出如下两点:Hibernate: 全自动化 ORM 框架,数据库移植性好,基础业务几乎不需要写 SQL;易学难精,上手简单但熟练使用需要阅读大量文档,框架结构复杂。MyBatis: 半自动化 ORM 框架,数据库移植性一般,基础业务仍需写 SQL,但可以通过基础 Mapper 来简化;易学易用,上手简单,结构精简清晰,易深入学习。对比发现: Hibernate 适合在需求明确、业务固定的项目中使用,如 OA、ERP 项目;MyBatis 适合在需求多变,快速迭代的项目中使用,如互联网的电商项目。
- Hibernate 一对一关联映射
- 验证一级缓存 需求:在 Session 关闭之前,连续查询相同的学生两次。Session session = sessionFactory.openSession();Transaction transaction = null;Student stu = null;try { transaction = session.beginTransaction(); stu = (Student) session.get(Student.class, new Integer(1)); System.out.println(stu.getStuName()); // 查询前面查询过的学生 System.out.println("--------------第二次查询------------------"); stu = (Student) session.get(Student.class, new Integer(1)); System.out.println(stu.getStuName()); transaction.commit();} catch (Exception e) { transaction.rollback();} finally { session.close();}运行结果如下:Hibernate: select student0_.stuId as stuId1_3_0_, student0_.classRoomId as classRoo6_3_0_, student0_.stuName as stuName2_3_0_, student0_.stuPassword as stuPassw3_3_0_, student0_.stuPic as stuPic4_3_0_, student0_.stuSex as stuSex5_3_0_ from Student student0_ where student0_.stuId=?Hibernate--------------第二次查询------------------Hibernate从输出结果中能得到什么结论?只有在第一次查询的时候,Hibernate 才会向数据库发送 SQL 语句请求,第二查询时,不需要再发送 SQL 请求,因为缓存中已经存在。稍微改动一下上述实例,创建两个 Session 对象,用来查询同一个学生:Session session = sessionFactory.openSession();Transaction transaction = null;Student stu = null;try { transaction = session.beginTransaction(); System.out.println("--------------第一次查询------------------"); stu = (Student) session.get(Student.class, new Integer(1)); System.out.println(stu.getStuName());} catch (Exception e) { transaction.rollback();} finally { session.close();}session = sessionFactory.openSession();try { transaction = session.beginTransaction(); // 查询前面查询过的学生 System.out.println("--------------第二次查询------------------"); stu = (Student) session.get(Student.class, new Integer(1)); System.out.println(stu.getStuName()); transaction.commit();} catch (Exception e) { transaction.rollback();} finally { session.close();}查看控制台上的输出结果:Hibernate: select student0_.stuId as stuId1_3_0_, student0_.classRoomId as classRoo6_3_0_, student0_.stuName as stuName2_3_0_, student0_.stuPassword as stuPassw3_3_0_, student0_.stuPic as stuPic4_3_0_, student0_.stuSex as stuSex5_3_0_ from Student student0_ where student0_.stuId=?Hibernate--------------第二次查询------------------Hibernate: select student0_.stuId as stuId1_3_0_, student0_.classRoomId as classRoo6_3_0_, student0_.stuName as stuName2_3_0_, student0_.stuPassword as stuPassw3_3_0_, student0_.stuPic as stuPic4_3_0_, student0_.stuSex as stuSex5_3_0_ from Student student0_ where student0_.stuId=?Hibernate每次查询都会发送 SQL 请求,这是因为 Session 缓存中的数据只能提供给本 Session 对象使用。不能跨 Session 使用。当调用 save ()、update () 或 saveOrUpdate () 方法传递一个对象时,或使用 load ()、 get ()、list ()、iterate () 方法获得一个对象时,该对象都将被加入到 Session 的内部缓存中;可以通过调用 close()、clear()、evict() 方法手工清空缓存中的数据。前面说过的,Session 生命周期很短,与 Session 关联的一级缓存的生命周期也很短,所以缓存的命中率是很低的。其对系统性能的改善也有限得很。Session 内部缓存的主要作用是保持 Session 内部数据状态同步。
- 2. Hibernate 是什么 简而言之:Hibernate 是一个 Java Jdbc 框架,用来简化 Java Jdbc 操作;Hibernate 也是一个ORM 框架,可以自动完成关系数据库中关系型数据到 Java 对象型数据的映射;当然,还可以说是一个持久化框架。以上说法其实是对完成同一件事情不同角度的诠释。Hibernate 的出现就是想让开发者的编码工作变得简单,这个简单指不需要在非核心逻辑编写上花费太多时间。
一对一hibernate相关搜索
-
yarn
yum
压缩工具
依赖关系
移动app
移动终端
移位操作
移位运算符
异常处理
易语言教程
音频格式
音频管理器
引入css
引用类型
英语词汇
用户界面
语言编程
语言工具
语言学习
语言转换