Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >【Hibernate】Hibernate框架配置详解

【Hibernate】Hibernate框架配置详解

作者头像
陈树义
发布于 2022-04-29 02:37:20
发布于 2022-04-29 02:37:20
1.4K00
代码可运行
举报
文章被收录于专栏:陈树义陈树义
运行总次数:0
代码可运行

通过Hibernate我们可以方便地操作数据库读取出来的信息,减少了繁琐的JDBC操作。

一般情况下,有两种方式可以进行Hibernate的配置,一种是通过配置文件进行配置,另一种是通过注解进行配置。

我将通过注解简单介绍Hibernate框架的配置。

Hibernate框架的配置一般可以分为以下几个步骤:

1.添加基本的Hibernate Jar包

2.添加注解的Jar包

3.编写Hibernate.cfg.xml文件

4.编写POJO文件,并编写注释

5.编写测试文件,导出到数据库进行测试。

一、导入基本的Hibernate Jar包

点击这里下载:http://pan.baidu.com/s/1gdf3K47 密码:siok

二、导入Hibernate Annotation 的Jar包

点击这里下载:http://pan.baidu.com/s/1gdf3K47 密码:siok

三、编写Hibernate.cfg.xml文件

代码语言:javascript
代码运行次数:0
复制
 1 <?xml version='1.0' encoding='UTF-8'?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 5 
 6 <!-- Generated by MyEclipse Hibernate Tools.                   -->
 7 <hibernate-configuration>
 8 
 9 <session-factory>
10     <!-- 配置JDBC连接属性 -->
11     <property name="myeclipse.connection.profile">
12         com.mysql.jdbc.Driver
13     </property>
14     <property name="connection.url">
15         jdbc:mysql://localhost:3306/basehibernate
16     </property>
17     <property name="connection.username">root</property>
18     <property name="connection.password">sa</property>
19     <property name="connection.driver_class">
20         com.mysql.jdbc.Driver
21     </property>
22     <property name="dialect">
23         org.hibernate.dialect.MySQLDialect
24     </property>
25 
26     <!-- 自动建表 -->
27     <property name="hbm2ddl.auto">auto</property>
28     <property name="connection.autocommit">true</property>

29     <mapping class="com.basehibernate.pojo.Department" />
30     <mapping class="com.basehibernate.pojo.Employee" />
31     <mapping class="com.basehibernate.pojo.Meal" />
32     <mapping class="com.basehibernate.pojo.OrderMeal" />
33     <mapping class="com.basehibernate.pojo.GradeMeal" />
34     <mapping class="com.basehibernate.pojo.RewardMeal" />
35 
36 </session-factory>
37 
38 </hibernate-configuration>

不同数据库连接在Hibernate.cfg.xml中的配置不同,这里以MySQL为例。

如果你用的是其他数据库,你可以点击这里查看相对应的Hibernate.cfg.xml文件:Hibernate 连接MySQL/SQLServer/Oracle数据库的hibernate.cfg.xml文件

5、编写POJO文件并编写注解

Department类:

代码语言:javascript
代码运行次数:0
复制
 1 package com.basehibernate.pojo;
 2 
 3 import java.util.List;
 4 
 5 import javax.persistence.Column;
 6 import javax.persistence.Entity;
 7 import javax.persistence.GeneratedValue;
 8 import javax.persistence.GenerationType;
 9 import javax.persistence.Id;
10 import javax.persistence.OneToMany;
11 import javax.persistence.Table;
12 
13 /**
14  * 部门类
15  * 时间:2014年5月8日 16:06:54
16  * 修改:2014年6月3日 20:17:27
17  * @author chenyr
18  *
19  */
20 /* @Entity 表示将这个POJO类作为一个实体解析 
21  * @Table表示数据库中的表格, name对应数据库的表明, catalog对应数据库名(可省略)
22  */
23 @Entity        
24 @Table(name = "t_busi_dept", catalog = "basehibernate")        
25 public class Department {
26     
27     /** 部门编号 **/
28     private int deptId;
29     
30     /** 部门名称 **/
31     private String deptName;
32     
33     /** 部门员工关系 **/
34     private List<Employee> employees;
35 
36     public Department() {
37         super();
38         // TODO Auto-generated constructor stub
39     }
40 
41     public Department(int deptId, String deptName, List<Employee> employees) {
42         super();
43         this.deptId = deptId;
44         this.deptName = deptName;
45         this.employees = employees;
46     }
47 
48     /* 
49      * @Id 表示将这个属性作为数据库表的主键 
50      * @Column 表示将这个属性作为数据库的一个字段, name属性指定数据库字段名, unique指定是否唯一, nullable指定是否允许为空, length指定字段长度
51      * @GeneratedValue 与@Id一起配合使用,指定主键的生成方式
52      */
53     @Id
54     @Column(name = "id", unique = true, nullable = false, length = 12)
55     @GeneratedValue( strategy = GenerationType.IDENTITY)
56     public int getDeptId() {
57         return deptId;
58     }
59 
60     public void setDeptId(int deptId) {
61         this.deptId = deptId;
62     }
63 
64     /*
65      * 普通属性列可以用@Column注解生成为一个普通的字段,也可以不用@Column注解。因为如果一个字段没有注解,那么Hibernate会自动将其作为一个普通的字段
66      * 如果你不想Hibernate自动将这个字段进行处理,那么请用注解 @Transient 将其标注
67      */
68     public String getDeptName() {
69         return deptName;
70     }
71 
72     public void setDeptName(String deptName) {
73         this.deptName = deptName;
74     }
75 
76     /*
77      * @OneToMany  一般情况下一对多的关系由多的一方维护,即Department类为被控方
78      * mappedBy   表示由多的一方中与自己关联的属性进行维护,也及由Employee中的dept属性维护
79      * targetEntity 表示与之关联的实体,也即 Employee类,可以省略
80      */
81     @OneToMany(mappedBy = "dept", targetEntity = Employee.class)
82     public List<Employee> getEmployees() {
83         return employees;
84     }
85 
86     public void setEmployees(List<Employee> employees) {
87         this.employees = employees;
88     }
89 }

Employee 类:

代码语言:javascript
代码运行次数:0
复制
  1 package com.basehibernate.pojo;
  2 
  3 import java.util.List;
  4 
  5 import javax.persistence.Entity;
  6 import javax.persistence.GeneratedValue;
  7 import javax.persistence.GenerationType;
  8 import javax.persistence.Id;
  9 import javax.persistence.JoinColumn;
 10 import javax.persistence.JoinTable;
 11 import javax.persistence.ManyToOne;
 12 import javax.persistence.OneToMany;
 13 import javax.persistence.Table;
 14 
 15 /**
 16  * 员工类<P>
 17  * 时间:2014年5月8日 18:24:46<P>
 18  * 修改:2014年6月3日 20:16:57<P>
 19  * @author chenyr<P>
 20  *
 21  */
 22 /*
 23  * 更多注释的意义请参照Department类
 24  */
 25 @Entity
 26 @Table(name = "t_busi_empl", catalog = "basehibernate")
 27 public class Employee {
 28     
 29     /** 工号 **/
 30     private int emplId;        
 31     
 32     /** 订餐昵称 **/
 33     private String nickname;     
 34     
 35     /** 订餐密码 **/
 36     private String password;    
 37     
 38     /** 是否启用订餐密码 **/
 39     private boolean pwFlag;        
 40     
 41     /** 是否自动订餐 **/
 42     private boolean autoEat;
 43     
 44     /** 员工姓名 **/
 45     private String emplName;        
 46     
 47     /** 所属部门 **/
 48     private Department dept;    
 49     
 50     public Employee() {
 51     }
 52 
 53     @Id
 54     @GeneratedValue( strategy = GenerationType.IDENTITY)
 55     public int getEmplId() {
 56         return emplId;
 57     }
 58 
 59     public void setEmplId(int emplId) {
 60         this.emplId = emplId;
 61     }
 62     
 63     public String getNickname() {
 64         return nickname;
 65     }
 66 
 67     public void setNickname(String nickname) {
 68         this.nickname = nickname;
 69     }
 70 
 71     public String getPassword() {
 72         return password;
 73     }
 74 
 75     public void setPassword(String password) {
 76         this.password = password;
 77     }
 78 
 79     public boolean isPwFlag() {
 80         return pwFlag;
 81     }
 82 
 83     public void setPwFlag(boolean pwFlag) {
 84         this.pwFlag = pwFlag;
 85     }
 86 
 87     public String getEmplName() {
 88         return emplName;
 89     }
 90 
 91     public void setEmplName(String emplName) {
 92         this.emplName = emplName;
 93     }
 94     
 95     public boolean isAutoEat() {
 96         return autoEat;
 97     }
 98 
 99     public void setAutoEat(boolean autoEat) {
100         this.autoEat = autoEat;
101     }
102 
103     /*
104      * @ManyToOne 本身类是多的一方,作为主控方,即Employee类为主控方
105      * @JoinTable 表示两者之间的关系在数据库中建成一个新的表
106      *         name:表示中间表的名称
107      *         joinColumns:建立本类表与中间表的外键关系,即建立员工表与中间表的外键关系                 name表示新表中外键的名字
108      *         inverseJoinColumns:建立被控方表与中间表的外键关系,即建立部门表与中间表的外键关系         name表示新表中外键的名字
109      */
110     @ManyToOne()
111     @JoinTable(
112             name = "t_busi_mid_deptempl",
113             joinColumns = @JoinColumn(name = "emplid"),
114             inverseJoinColumns = @JoinColumn(name = "deptid")
115     )
116     public Department getDept() {
117         return dept;
118     }
119 
120     public void setDept(Department dept) {
121         this.dept = dept;
122     }
123 }

如果你想要了解更多的关于Hibernate Annotation的知识,你可以阅读我的另一篇博文:Hibernate Annotation注解详解

五、编写测试文件

编写测试文件,自动生成数据库表:

代码语言:javascript
代码运行次数:0
复制
 1 package com.basehibernate.test;
 2 
 3 /**
 4  * POJO注解导入数据库测试类
 5  * 用于测试Annotation注解的POJO类是否能自动生成数据库表
 6  * 时间:2014年6月4日 10:15:06
 7  * @author chenyr
 8  */
 9 
10 import org.hibernate.cfg.AnnotationConfiguration;
11 import org.hibernate.tool.hbm2ddl.SchemaExport;
12 import org.junit.Test;
13 
14 
15 public class HibernateUtil {
16     
17     @Test public void initiateHibernate()
18     {
19         /* 这里必须用AnnotatioinConfiguration类,因为你是用注解配置的,而不是用配置文件配置的 */
20         AnnotationConfiguration config = new AnnotationConfiguration().configure();
21         
22          SchemaExport export = new SchemaExport(config);  
23          export.create(true, true);  
24     }
25 } 

提示:①Hibernate注解的POJO类里必须要有一个作为主键,否则会出现“identifier not found"的错误。

②如果你使用的是Oracle数据库,因为Oracle数据库不支持主键自增长,必须使用序列实现自增长。你可以使用下面你的代码标注主键:

代码语言:javascript
代码运行次数:0
复制
1     @Id
2     @SequenceGenerator(name = "generator",sequenceName="product_id_seq")
3     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "generator")
4     public int getId() {
5         return id;
6     }    

③如果你执行Junit测试之后,Junit没有报错,但是数据库没有创建对应的表,那可能是因为你没有导入对应的驱动包。

④如果Junit执行成功,但是数据库里只有部分的表。那么请检查POJO类文件的注解是否正确,重点检查类头@Entity @Table 部分的注解,两个POJO类中@Table 注解中的name属性相同会导致这个错误。

连接Oracle时,在@Table注解中加入了catalog属性也会出现这个错误。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hibernate注解之基本注解的注解使用
文章目录 1. Hibernate注解之基本注解的注解使用 1.1. 使用注解须知 1.2. 类级别注解 1.3. 属性级别的注解 1.4. 主键相关的注解 1.5. 与非主键相关的注解 1.6. 实例 1.7. @JoinColumn 1.8. @JoinTabl 1.9. 参考文档 Hibernate注解之基本注解的注解使用 使用注解须知 我们在使用注解自动创建表的时候,系统会默认为我们创建一张表Hibernate_sequence,我们可以在Hibernate.cfg.xml文件中添加如下语句解决
爱撒谎的男孩
2019/12/31
2K0
Hibernate Annotation (Hibernate 注解)
英文:http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/
Hongten
2018/09/18
1.4K0
Hibernate关联关系
文章目录 1. Hibernate关联关系 1.1. 一对一 1.1.1. 背景 1.1.2. 准备 1.1.3. 单向外键关联 1.1.3.1. 通过丈夫访问妻子 1.1.3.2. 通过妻子访问丈夫 1.1.3.3. 总结 1.1.4. 双向外键关联(@OneToOne(mappedBy=””) 1.1.4.1. 问题 1.1.4.2. 解决办法 1.1.4.3. 实现 1.1.4.4. 测试 1.2. 一对多 1.2.1. 准备 1.2.2. 前提须知 1.2.3. 单向外键关联 1.2.3.1.
爱撒谎的男孩
2019/12/31
6.3K1
[ SSH框架 ] Hibernate框架学习之四(JPA操作)
一、JPA概述以及它和Hibernate之间的关系 1.1.Hibernate 概述   JPA Java Persistence API,是EJB3规范中负责对象持久化的应用程序编程接口(ORM接口),它定义一系列的注释。这些注释大体可分为:类级别注释、方法级别注释、字段级别注释。给实体类添加适当的注释可以在程序运行时告诉Hibernate如何将一个实体类保存到数据库中以及如何将数据以对象的形式从数据库中读取出来。   目前有两种注释方案可以确定对象与表格之间的对应关系:一种是注释实体类的属性字段(字段级
Kevin_Zhang
2018/05/22
6.8K0
Hibernate关联关系映射[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115516.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/10
5770
走进JavaWeb技术世界13:Hibernate入门经典与注解式开发
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/10/24
1.8K0
Hibernate之关联关系映射(一对多和多对一映射,多对多映射)
别先生
2018/01/02
4.7K0
Hibernate之关联关系映射(一对多和多对一映射,多对多映射)
jpa/springdata(1)jpa
假如学过hibernate在jpa会发现非常的简单,因为是同一个人写的,jpa是第三方orm框架的一种规范,hibernate作为jpa 的一个子集
全栈程序员站长
2021/06/17
2K0
hibernate笔记(四)
3) HQL查询, Hibernate Query language hibernate 提供的面向对象的查询语言。
HUC思梦
2020/09/03
6980
SSH框架之Hibernate第四篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/09/18
3.5K0
Hibernate【映射】知识要点
前言 前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的…因此,本博文主要讲解关联映射 集合映射 需求分析:当用户购买商品,用户可能有多个地址。 数据库表 我们一般如下图一样设计数
Java3y
2018/03/15
2.1K0
Hibernate【映射】知识要点
SpringBoot重点详解–使用JPA操作数据库[通俗易懂]
使用数据库是开发基本应用的基础,借助于开发框架,我们已经不用编写原始的访问数据库的代码,也不用调用JDBC(Java Data Base Connectivity)或者连接池等诸如此类的被称作底层的代码,我们将从更高的层次上访问数据库,这在Springboot中更是如此,本章我们将详细介绍在Springboot中使用 Spring Data JPA 来实现对数据库的操作。
全栈程序员站长
2022/06/25
2.9K0
SpringBoot重点详解–使用JPA操作数据库[通俗易懂]
Spring与Hibernate3集成
        Spring内置了一组DAO组件,可以针对JDBC、Hibernate、iBATIS等常见数据访问技术提供简化操作,让我们把精力集中在核心的数据操作上。
用户10175992
2022/11/15
7780
Spring与Hibernate3集成
Hibernate框架学习之注解配置关系映射
     上篇文章我们通过注解对映射了单个实体类,但是具体项目中往往实体类之间又是相互关联的,本篇文章就是从实体类之间存在的不同关联角度,具体学习下如何映射他们之间的关联,主要涉及内容如下: 单向的一
Single
2018/01/04
2.3K0
Hibernate框架学习之注解配置关系映射
hibernate的关联与级联
1、关联指的是类之间的引用关系。如果类A与类B关联,那么被引用的类B将被定义为类A的属性。 2、关联的分类:关联可以分为一对一、一对多/多对一、多对多关联
全栈程序员站长
2022/08/04
1.3K0
hibernate的关联与级联
Spring全家桶之SpringData——Spring 整合Hibernate与Hibernate Jpa
注意 1. sql语句 ,是通过对象查询的表 ,虽然可以出现select 但是却不能出现通配符 *,故可以省略 Select * 2 .区别 getCurrentSession 与openSession 方法的用法 getCurrentSession:当前session 必须要有事务边界, 且只能处理唯一的一个事务。当事务提交或者回滚后session 自动失效 openSession:每次都会打开一个新的session.加入每次使用多次。则获得的是不同session 对象。使用完毕后我们需要手动的调用colse方法关闭session
时间静止不是简史
2020/07/25
2.9K0
hibernate5二级缓存配置
hibernate默认有一个一级缓存,就是默认的Session缓存,当我们做了一次查询,hibernate会把这个结果缓存起来,叫做一级缓存,当我们接着在这个Session会话里面再做一次同样条件的查询,hibernate不会再次查询数据库,而是直接在一级缓存中获取结果并返回。一级缓存是内置的,他也不能被卸载。一级缓存是指在同一个Session会话内的查询做的缓存,如果跨了Session,或者当前Session关闭,重新开启了一个新的Session,这时候一级缓存是失效的。
全栈程序员站长
2022/08/31
3530
hibernate5二级缓存配置
Spring全家桶之SpringData——Spring Data JPA
举例: @JoinTable(name=“t_roles_menus”,joinColumns=@JoinColumn(name=“role_id”),inverseJoinColumns=@JoinColumn(name=“menu_id”))
时间静止不是简史
2020/07/24
3.8K0
Spring全家桶之SpringData——Spring Data JPA
hibernate笔记(二)
在一对多与多对一的关联关系中,保存数据最好的通过多的一方来维护关系,这样可以减少update语句的生成,从而提高hibernate的执行效率!
HUC思梦
2020/09/03
5470
Hibernate学习笔记 多表映射
前面说了Hibernate的单表映射,由于是实体类和数据表之间一对一的映射,所以比较简单。现在就来说说多表映射,这需要涉及到多个实体类和数据表之间的关系。因此稍微复杂一点。
乐百川
2022/05/05
1.6K0
推荐阅读
相关推荐
Hibernate注解之基本注解的注解使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验