本文主要说的是Session的saveOrUpdate、clear、flush等方法的使用以及控制建表语句的输出等。
1.Session的saveOrUpdate方法
先看下hibernate的API文档的相关描述:
void |
saveOrUpdate(Object object) Either save() or update() the given instance, depending upon the value of its identifier property. |
看下方法发的详解
public void saveOrUpdate(Object object) throws HibernateException
object
- a transient or detached instance containing new or updated state
HibernateException
save(java.lang.Object)
,
Session#update(Object object, Serializable id)
仍然使用之前的Techer
package com.baosight.model;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.SequenceGenerator;
import javax.persistence.TableGenerator;
/**
* Title:
* Description:Teacher
* Company:
* @author yuan
* @date 2016-4-10 下午12:32:46*/
@Entity
@TableGenerator(name="tableGEN",table="table_gen",pkColumnName="pk_key",valueColumnName="pk_value",pkColumnValue="teacher",allocationSize=1)
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB")
//@IdClass(value=TeacherPK.class)
public class Teacher {
private String id;
private String name;
private String title;
// private TeacherPK pk;
@Id
@GeneratedValue//auto
// @GeneratedValue(strategy=GenerationType.TABLE,generator="tableGEN")
// @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
// @Id
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// @Column(updatable=false)
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
// @EmbeddedId
// @Id
/*public TeacherPK getPk() {
return pk;
}
public void setPk(TeacherPK pk) {
this.pk = pk;
}*/
}
使用JUnit测试
package com.baosight.model;
import static org.junit.Assert.*;
import javax.persistence.Column;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Title:TecherTest
* Description:TODO
* Company:
* @author yuan
* @date 2016-4-13 下午10:32:17*/
public class TeacherTest {
private static SessionFactory sf = null;
@BeforeClass
public static void beforeClass(){
// 读取配置文件
Configuration cfg = new AnnotationConfiguration();
// 得到session工厂
sf = cfg.configure().buildSessionFactory();
}
@Test
public void testSaveOrUpdate() {
// 教师测试类
Teacher t = new Teacher();
t.setName("t1");
t.setTitle("中级");
Session session = sf.getCurrentSession();
// 开启事务
session.beginTransaction();
// session执行
session.saveOrUpdate(t);
// 事务提交
session.getTransaction().commit();
t.setName("zhangsan");
Session session1 = sf.getCurrentSession();
// 开启事务
session1.beginTransaction();
// session执行
session1.saveOrUpdate(t);
// 事务提交
session1.getTransaction().commit();
}
@Test
public void testClear() {
//直接从数据库查询,会打印sql
Session session = sf.getCurrentSession();
// 开启事务
session.beginTransaction();
// session执行
Teacher t = (Teacher) session.get(Teacher.class, "1");
System.out.println(t.getId());
session.clear();
Teacher t1 = (Teacher) session.get(Teacher.class, "1");
System.out.println(t1.getId());
System.out.println(t1==t);
// 事务提交
session.getTransaction().commit();
}
@Test
public void testFlush() {
//直接从数据库查询,会打印sql
Session session = sf.getCurrentSession();
// 开启事务
session.beginTransaction();
// session执行
Teacher t = (Teacher) session.load(Teacher.class, "1");
t.setName("tttt");
session.flush();
t.setName("lisi");
session.getTransaction().commit();
// session执行
// 事务提交
}
@Test
public void testSchemaExport() {
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
}
@AfterClass
public static void afterClass(){
// 关闭session工厂
sf.close();
}
}
2.Session的clear方法
先看下hibernate的API的介绍
void |
clear() Completely clear the session. |
public void clear()
就是说调用clear方法会清除session已经存在的所有缓存的实例
使用JUnit进行测试
调用上面的testClear方法,不使用clear时发现只做了一次查询,结果如下:
testClear使用clear之后,发现查询了2次
3.Session的flush方法
先看下hibernate的API的介绍
void |
flush() Force the Session to flush. |
public void flush() throws HibernateException
HibernateException
也就是说flush默认是在Transaction.commit()时被调用,可以通过调用Session的flush方法实现在Transaction.commit()之前就调用flush,实现数据的存储和状态的同步。
使用JUnit进行测试
调用上面的testFlush方法,当不使用flush时,只会在Transaction.commit()时做一次修改,结果如下:
testFlush使用flush后,后做2次修改
4.关于使用SchemaExport输出建表语句
hibernate的配置文件hibernate.cfg.xml中可以配置hbm2ddl.auto,以实现控制建表等,具体配置如下:
update
属性值update可以换成create,这样每次都会重新建表
当然,hibernate也可以通过代码来实现这个过程,即使用SchemaExport
首先看下hibernate的API文档
java.lang.Object org.hibernate.tool.hbm2ddl.SchemaExport
Commandline tool to export table schema to the database. This class may also be called from inside an application.
命令行工具导出表的数据库架构。这个类可以在应用程序中调用。构造方法
SchemaExport(Configuration cfg)
Create a schema exporter for the given Configuration
需要加载配置文件,跟使用session时差不多
实现代码见上面的testSchemaExport方法,具体如下:
@Test
public void testSchemaExport() {
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
}
void |
create(boolean script, boolean export) Run the schema creation script. |
public void create(boolean script, boolean export)
script
- print the DDL to the console
export
- export the script to the database
使用JUnit测试,调用上面的testSchemaExport方法,第一个参数为true时,结果如下:
create的第一个参数为false时
以上即为hibernate的除了常规的CRUD之外比较常见的方法,需要在实际的使用过程中仔细体会。