package demo;
import javax.persistence.*;
import java.util.Date;
@Entity
@Table(name="users")
public class Users {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="user_id")
private int id;
@Column(name="user_name")
private String name;
@Column(name="user_password")
private String password;
@Column(name="create_date")
@Temporal(TemporalType.DATE)
private Date createDate;
@Column(name="user_icon")
private String icon;
//省略所有属性的 get、set方法
}
com.mysql.jdbc.Driver
jdbc:mysql://localhost/iogames
root
mysql1994assad
20
1
5000
100
3000
2
true
org.hibernate.dialect.MySQL55Dialect
update
true
true
package demo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import java.util.Date;
public class UserManager {
public static void main(String[] args){
//根据配置文件创建连接注册对象
StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure("hibernate.cfg.xml")
.build();
//以连接注册对象创建 SessionFactory 对象
SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
try{
//创建一个Session会话对象
Session session = sessionFactory.openSession();
//开始事务
Transaction tran = session.beginTransaction();
//创建一个Users对象,这部分为实际的数据库CRDU操作区域
Users user = new Users();
user.setName("Al-assad");
user.setPassword("123");
user.setCreateDate(new Date());
user.setIcon("1");
//会话对象保存User,事务提交
session.save(user);
tran.commit();
//关闭 Session、 SessionFactory 连接
session.close();
sessionFactory.close();
}catch(Exception ex){
StandardServiceRegistryBuilder.destroy(registry);
}
}
}
其中关于 Sessionfactory,Session,Transaction 等主要数据库操作对象的解释,可以参见: http://blog.csdn.net/al_assad/article/details/77887263
- 结构体系
HibernateUtil.java
import org.hibernate.*;
import org.hibernate.service.*;
import org.hibernate.boot.registry.*;
import org.hibernate.cfg.*;
public class HibernateUtil{
public static SessionFactory sessionFactory;
static{
try{
//根据配置文件创建连接注册对象
StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure("hibernate.cfg.xml")
.build();
//以连接注册对象创建 SessionFactory 对象
sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
}catch (Throwable ex){
throw new ExceptionInInitializerError(ex);
}
}
// ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException{
Session s = session.get();
// 如果该线程还没有Session,则创建一个新的Session
if (s == null){
s = sessionFactory.openSession();
// 将获得的Session变量存储在ThreadLocal变量session里
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException{
Session s = session.get();
if (s != null)
s.close();
session.set(null);
}
}
public class UserManager {
public static void main(String[] args){
//创建一个Session会话对象
Session session = HibernateUitl.currentSession();
//开始事务
Transaction tran = session.beginTransaction();
//创建一个Users对象,这部分为实际的数据库CRDU操作区域
Users user = new Users();
user.setName("Al-assad");
user.setPassword("123");
user.setCreateDate(new Date());
user.setIcon("1");
//会话对象保存User,事务提交
session.save(user);
tran.commit();
//关闭Session
SessionUtil.closeSession();
}
}
- 瞬态:PO 实例与 Session 从未关联过,此事 PO 实例处于瞬态;
- 持久化:PO 实例与 Session 关联起来,该示例对应到数据库记录,则该实例处于持久化态;
- 脱管态:PO 实例曾经与 Session 关联过,但是由于 Session 关闭等原因,PO 实例脱离了 Session 的托管,此时该实例处于脱管态;
① 持久化实体
将瞬态对象转变为持久化对象,使用 Session 对象的 save(), persist() 方法;
Users user = new User(); user.setName("assad"); session.save(user);
②根据主键加载持久化实体
可以通过Session 的 get() ,load() 方法根据主键加载一个实体,不同的是如果指定主键的实体不存在,get返回null,load抛出一个HibernateException;
User user = session.get(User.class,"20140302");
③更新持久化实体
User user = session.get(User.class,"20140302"); user.setName("assad"); session.flush();
④更新托管主体
对于一个已经脱离了 Session 管理的实体,当程序修改了托管对象的状态后,需要显式地使用新的 Session 来保存这些修改,可以使用 Session 对象的 update(),merge(),updateOrSave() 方法进行保存修改的实体;
update 方法会直接将该对象持久化,如果该对象曾经实体化过,使用update,如果没有,使用save,不确定时,使用 updateOrSave;
merge 方法区别于 update,不会直接持久化该对象,而是向将该对象拷贝一个副本,将该副本持久化,但是原来的对象不持久化,也不重新关联Session;
Session sess1 = sessionFactory.openSession(); User user = sess1.get(User.class,"20140302"); sess1.close(); user.setName("assad"); Session sess2 = sessionFactory.openSession(); sess2.update(user);
⑤删除持久化实体可以使用 Session 的 delete 方法删除持久化实体,一旦删除该持久化实体,其对应的数据表记录也会被删除;
User user = session.get(User.class,"20140302"); session.delete(user);
事务操作
Hibernate 的事务操作是通过对 Session 对象的 Transaction 对象来实现的;事务的提交
public static void main(String[] args){
Session session = HibernateUitl.currentSession();
Transaction tran = session.beginTransaction(); //开始事务
//CRUD操作
Users user = new Users();
user.setName("Al-assad");
user.setPassword("123");
session.save(user);
tran.commit(); //事务提交
SessionUtil.closeSession();
}
public static void main(String[] args){
Session session = HibernateUitl.currentSession();
Transaction tran = session.beginTransaction(); //开始事务
//CRUD操作
Users user = new Users();
user.setName("Al-assad");
user.setPassword("123");
if(flag) { //回滚条件
tran.rollback(); //事务回滚
}
session.save(user);
tran.commit(); //事务提交
SessionUtil.closeSession();
}