摘要
Hibernate是JavaEE中非常流行的框架,目的是完成Java实体类到数据库中表之间的映射。它最开始只关注Java与关系型数据库中的关系,由于非关系型数据库的逐渐流行,因此它也延伸到对非关系型数据库的映射。Hibernate将JDBC进行了进一步封装,使开发人员不必写任何与数据库相关的sql语句,只需要写Java代码和配置文件就可以完成持久化操作。配置文件可以由Java注解代替,因此可以完全由Java代码就可以完成实体类到表(或者其他类型)的映射。
1 Hibernate的配置文件hibernate.cfg.xml
<?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>
<!-- An database configuration -->
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.password">lwb12345</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/hibernatedb</property>
<property name="hibernate.connection.username">postgres</property>
<property name="hibernate.connection.pool_size">2</property>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQL94Dialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- An object to table -->
<mapping class="org.weebing.dto.UserDetails"/>
</session-factory>
</hibernate-configuration>
<property name=“hibernate.hbm2ddl.auto”>create</ property> 写上就不需要在数据库手动建表,hibernate自动帮助我们建表。
2 实例
2.1 实体类
实体类将被Hibernate自动映射为数据库中的表
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Person {
@Id
private int id;
private String name;
private int age;
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
@Entity
注解表示实体类,对应于数据库中的表结构。@Id
注解对应于数据库中表的主键。
2.2 持久化操作
下面代码将person对象存储在了数据库中。
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.weebing.domain.Person;
public class PersonRepository {
public static void main(String[] args) {
// 实体类创建
Person person = new Person();
person.setId(101);
person.setName("weebing");
person.setAge(18);
// 添加实体类到数据库
Configuration conf = new Configuration().configure().addAnnotatedClass(Person.class);
SessionFactory sessionFactory = conf.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
session.save(person);
transaction.commit();
}
}
示例代码仅包含部分关键的注解,其他注解请查看官方文档。
2.3 实体类与表的映射关系
实体类 | 表 |
---|---|
类实例 | 一条记录 |
成员变量 | 属性 |
标注为@Id的成员变量 | 主键 |
2.4 会话与事务之间的关系
会话(session)表示实体类与数据库的一次连接,它们之间连接中断,则会话中断。事务(Transaction)表示会话连接中的一次逻辑操作单元。事务具有四个重要特性:原子性、一致性、隔离性和持久性。他的两个关键操作是“提交”和“回滚”。由定义可知,一个会话可以包含多个事务,一个具体事务仅包含在唯一存在的会话中。
2.5 浅析Hibernate底层实现原理
包括Hibernate在内的JavaEE框架都大量使用的反射机制,反射可以在运行时获取当前对象对应的类型,从而自动调用相关的方法,而不需要开发人员再写大量重复代码了,因此,开发效率得到极大提高。