Hibernate配置
- 首先Hibernate需要事先知道在哪里找映射信息。
- == hibernate.properties == 或者 hibernate.cfg.xml文件
重要的属性
属性 | 描述 |
---|---|
hibernate.dialect | 这个属性使 Hibernate 应用为被选择的数据库生成适当的 SQL |
hibernate.connection.driver_class | JDBC 驱动程序类 |
hibernate.connection.url | 数据库实例的 JDBC URL |
hibernate.connection.username | 数据库用户名 |
hibernate.connection.password | 数据库密码 |
hibernate.connection.pool_size | 限制在 Hibernate 应用数据库连接池中连接的数量 |
hibernate.connection.autocommit | 允许在 JDBC 连接中使用自动提交模式 |
使用 JNDI 和数据库应用程序服务器然后必须配置以下属性
属性 | 描述 |
---|---|
hibernate.connection.datasource | 在应用程序服务器环境中正在使用的应用程序 JNDI 名 |
hibernate.jndi.class | JNDI 的 InitialContext 类 |
hibernate.jndi. | 在 JNDI的 InitialContext 类中通过任何你想要的 Java 命名和目录接口属性 |
hibernate.jndi.url | 为 JNDI 提供 URL |
hibernate.connection.username | 数据库用户名 |
hibernate.connection.password | 数据库密码 |
一般情况下hibernate.cfg.xml在应用程序的根目录创建
例子:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect //MySQL方言属性
</property>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- Assume test is the database name -->
<property name="hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name="hibernate.connection.username">
root
</property>
<property name="hibernate.connection.password">
root123
</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!--
1:每次在创建sessionFactory时执行创建表,当调用sessionFactory的close方法的时候,删除表
#hibernate.hbm2ddl.auto create-drop
2:每次都重新建表,如果已经存在就先删除再创建
#hibernate.hbm2ddl.auto create
3:如果表不存在就创建,表存在就不创建
#hibernate.hbm2ddl.auto update
4:生成环境时候执行验证,当映射文件的内容与数据库表结构不一样的时候就报错
#hibernate.hbm2ddl.auto validate
-->
<!--加载映射文件,可以有多个,写全路径 -->
<mapping resource="类名.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Session:用于获取与数据库的物理连接
Session的主要功能是为映射实体类的实例提供创建、读取、删除操作。
创建session对象
public class HibernateUtil {
//Hibernate4创建session对象
public static Session getSession4() {
Session session = null;
// 创建一个读取主配置文件的对象
Configuration cfg = new Configuration();
// 读取主配置文件
cfg.configure();
// 在4.x版中创建sessionfactory时,需要传入一个参数serviceRegistry
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties())
.buildServiceRegistry();
// 创建Session工厂
SessionFactory factory = cfg.buildSessionFactory(serviceRegistry);
// 打开Session
// session = factory.openSession();
// 如果在主配置文件将session绑定到线程中,所以可以从线程中取出session
session = factory.getCurrentSession();
return session;
}
//Hibernate5创建session对象
public static Session getSession5() {
Session session = null;
// 创建一个读取主配置文件的对象
Configuration cfg = new Configuration();
// 读取主配置文件
cfg.configure();
// 创建Session工厂
SessionFactory factory = cfg.buildSessionFactory();
// 打开Session
// session = factory.openSession();
// 如果在主配置文件将session绑定到线程中,所以可以从线程中取出session
session = factory.getCurrentSession();
return session;
}
}
一些常见的Session接口方法
方法 | 说明 |
---|---|
Transaction beginTransaction() | 开始工作单位,并返回关联事务对象 |
void cancelQuery() | 取消当前的查询执行 |
void clear() | 完全清除该会话 |
Connection close() | 通过释放和清理 JDBC 连接以结束该会话 |
Criteria createCriteria(Class persistentClass) | 为给定的实体类或实体类的超类创建一个新的 Criteria 实例 |
Criteria createCriteria(String entityName) | 为给定的实体名称创建一个新的 Criteria 实例 |
Serializable getIdentifier(Object object) | 返回与给定实体相关联的会话的标识符值 |
Query createFilter(Object collection, String queryString) | 为给定的集合和过滤字符创建查询的新实例 |
Query createQuery(String queryString) | 为给定的 HQL 查询字符创建查询的新实例 |
SQLQuery createSQLQuery(String queryString) | 为给定的 SQL 查询字符串创建 SQLQuery 的新实例 |
void delete(Object object) | 从数据存储中删除持久化实例 |
void delete(String entityName, Object object) | 从数据存储中删除持久化实例 |
Session get(String entityName, Serializable id) | 返回给定命名的且带有给定标识符或 null 的持久化实例(若无该种持久化实例) |
SessionFactory getSessionFactory() | 获取创建该会话的 session 工厂 |
void refresh(Object object) | 从基本数据库中重新读取给定实例的状态 |
Transaction getTransaction() | 获取与该 session 关联的事务实例 |
boolean isConnected() | 检查当前 session 是否连接 |
boolean isDirty() | 该 session 中是否包含必须与数据库同步的变化 |
boolean isOpen() | 检查该 session 是否仍处于开启状态 |
Serializable save(Object object) | 先分配一个生成的标识,以保持给定的瞬时状态实例 |
void saveOrUpdate(Object object) | 保存(对象)或更新(对象)给定的实例 |
void update(Object object) | 更新带有标识符且是给定的处于脱管状态的实例的持久化实例 |
void update(String entityName, Object object) | 更新带有标识符且是给定的处于脱管状态的实例的持久化实例 |
Hibernate 映射文件
对象/关系型映射 一般定义在XML文件中
需要以== className.hbm.xml ==格式保存映射文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="映射的类名" table="表名">
<meta attribute="class-description">
//对此类的描述 meta标签可不写
</meta>
//<id>标签关联主键
<id name="类属性名" type="映射的java类型" column="表主键名">
//生成主键 native自行判断生成方式
<generator class="native"/>
</id>
//<property>匹配Java类属性和数据库表的列
<property name="类属性名" column="表列名" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
<!--
set集合属性的映射:重点消化
name指定要映射的set集合的属性
table集合属性要映射的表
key指定集合表(t_address)的外键字段
element指定集合表的其他字段
type元素类型,一定要指定
-->
<set name="address" table="t_address">
<key column="uid"></key>
<element column="address" type="string"></element>
</set>
<!--
List集合属性的映射
name指定要映射的list集合的属性
table集合属性要映射的表
key指定集合表(t_addressList)的外键字段
element指定集合表的其他字段
type元素类型,一定要指定
list-index是list集合一定要指定的,指定排序列的名称,因为list是有序的
-->
<list name="addressList" table="t_addressList">
<key column="uid"></key>
<list-index column="idx"></list-index>
<element column="address" type="string"></element>
</list>
<!--
Map映射
name指定要映射的map集合的属性
table集合属性要映射的表
key指定集合表(t_addressMap)的外键字段
element指定集合map的其他字段value
type元素类型,一定要指定
map-key指定map的key
-->
<map name="addressMap" table="t_addressMap">
<key column="uid"></key>
<map-key type="string" column="shortName"></map-key>
<element type="string" column="address"></element>
</map>
<--
这里一共四个表
1.和java实体类对应的表
2.和set集合对应的表
3.和list集合对应的表
4.和map集合对应的表
-->
</hibernate-mapping>
关系映射
many-to-one
<!--
多对一:假设表A是多,B是一
B的实体类是BOne
A的实体类是AMany
a中有个属性BOne
-->
<many-to-one name="BOne" class="B实体类全路径" column="A表外键"/>
one-to-many
<!--
一对多:假设A是一,B是多
A表实体类是AOne
B表实体类是BMany
B表中有个属性Set<AOne> aOnes
-->
<set name="aOnes">
<key column="B外键">
<one-to-many class="AOne类全名"/>
</set>
many-to-many
<!--
表A实体类AMany
表B实体类BMany
每个实体类都有对方的一个Set<>属性
-->
<set name=" Set的属性名 " table="中间表">
<key column="当前对象中对应中间表的外键名称">
<many-to-many class="对方类的全路径" column="对方类在中间表中的外键名称"/>
</set>
Hibernate注释
启动注释需要三个包:
- hibernate-annotations.jar,
- lib/hibernate-comons-annotations.jar
- lib/ejb3-persistence.jar
注释 | 含义 |
---|---|
@Entity | 标志这个类是一个实体bean,所以它必须含有一个没有参数的构造函数并且在可保护范围是可见的。 |
@Table | 提供了四个属性,允许覆盖的表的名称,目录及其模式,在表中可以对列制定独特的约束 |
@Id | 自动确定最合适的主键生成策略 |
@GeneratedValue | 覆盖主键自动生成策略(有两个属性strategy和generator,也可不写) |
@Column | 指定映射关系(name:指定列名,length:设置大小,nullable:列可以被标记为非空,unique:唯一约束) |
Hibernate查询语句
Query对象也就是查询对象,通过query.list()得到结果。
- FROM 语句;在存储中加载一个完整并持久的对象
- String hql = “FROM Employee”;
Query query = session.createQuery(hql);
List results = query.list(); - String hql = “FROM com.hibernatebook.criteria.Employee”;
Query query = session.createQuery(hql);
List results = query.list();
- String hql = “FROM Employee”;
- SELECT 语句比from 语句提供了更多的对结果集的控制
- String hql = “SELECT E.firstName FROM Employee E”;
Query query = session.createQuery(hql);
List results = query.list();
- String hql = “SELECT E.firstName FROM Employee E”;
- WHERE 语句;精确地从数据库存储中返回特定对象
- String hql = “FROM Employee E WHERE E.id = 10”;
Query query = session.createQuery(hql);
List results = query.list();
- String hql = “FROM Employee E WHERE E.id = 10”;
- ORDER BY 语句
- GROUP BY 语句
- 使用命名参数
*String hql = “FROM Employee E WHERE E.id = :employee_id”;
Query query = session.createQuery(hql);
query.setParameter(“employee_id”,10);
List results = query.list(); - UPDATE 语句
- DELETE 语句
- 标准查询
- Criteria cr = session.createCriteria(Employee.class);
List results = cr.list();
- Criteria cr = session.createCriteria(Employee.class);
- 对标准的限制:使用 Criteria 对象可用的 add() 方法去添加一个标准查询的限制。
- Criteria cr = session.createCriteria(Employee.class);
cr.add(Restrictions.eq(“salary”, 2000));
List results = cr.list();
- Criteria cr = session.createCriteria(Employee.class);
缓存
- 一级缓存Session
- 二级缓存
- 查询层次缓存
- 并发策略
拦截器
直接实现 Interceptor 类或者继承 EmptyInterceptor 类