hibernate3第二章之JUNIT简单单元测试、CRUD、三种状态、主键生成策略
2015-08-23 11:00
375 查看
这次主要是在第一章的基础上做HIBERNATE开发
一、搭建JUNIT环境:
1.加junit包:
junit-4.5.jar
2.创建与src同目录文件夹 test (这和maven差不多,把开发代码和测试代码分开放)
3.要测试src下的哪个类哪个方法就在test下设置同样的路径,类名为你要测试的类+Test,方法名为test+你要测试方法;
如要测试Teacher类:
1.@BeforeClass是某方法开始之前要运行的
2.@AfterClass是某方法结束后要运行的
3.SessionFactory设置成静态是要做单例
4.本类测试了load,get方法(load先不查数据库,需要数据库的时候再查;get为直接查数据库)
测试了 save,update,delete方法;(在update中,值更改其中一个属性的值,但是会把所有属性的值都会更新一遍,为了避免这种情况,可以在model的XML配置文件里该类class标签加上dynamic-update=”true“,如<class name="Student" table="student" dynamic-update="true">,挺悲剧的是annotation中没有相关注释,所以只能在XML里配置了)
测试了clear,flush方法(clear是马上清楚session缓存(数据清除),flush为强制与数据库同步(存入数据库))
5.testSchemaExport:让hibernate根据model配置自动创建数据库表
@GeneratedValue(strategy=GenerationType.IDENTITY)是设置主键ID生成策略,mysql用的是IDENTITY,oracle用的是SEQUENCE,还有一种用表做自增TABLE很少用到
1.如果用的是ORACLE的话需要在类的@Entity下定义一下具体的SEQUENCE,不然会公用一个SEQUENCE:
@SequenceGenerator(name="teacherSEQ",sequenceName="realOracleSEQ")
2.然后在@Id下加上定义的SEQUENCE:
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
@Temporal(TemporalType.DATE)是存储日期还是时间,默认不写是存日期+时间,DATE是日期,TIME是时间
1:Transient :瞬时状态 ;Persistent:持久化状态 ;Detached:脱离状态
瞬时状态:new出来还没有存入数据库的时候
持久化状态:存入数据库了还有关闭session的状态
脱离状态:session已经关闭,内存中还存在,但是session已经不指向不引用的时候
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
一、搭建JUNIT环境:
1.加junit包:
junit-4.5.jar
2.创建与src同目录文件夹 test (这和maven差不多,把开发代码和测试代码分开放)
3.要测试src下的哪个类哪个方法就在test下设置同样的路径,类名为你要测试的类+Test,方法名为test+你要测试方法;
如要测试Teacher类:
1.@BeforeClass是某方法开始之前要运行的
2.@AfterClass是某方法结束后要运行的
3.SessionFactory设置成静态是要做单例
4.本类测试了load,get方法(load先不查数据库,需要数据库的时候再查;get为直接查数据库)
测试了 save,update,delete方法;(在update中,值更改其中一个属性的值,但是会把所有属性的值都会更新一遍,为了避免这种情况,可以在model的XML配置文件里该类class标签加上dynamic-update=”true“,如<class name="Student" table="student" dynamic-update="true">,挺悲剧的是annotation中没有相关注释,所以只能在XML里配置了)
测试了clear,flush方法(clear是马上清楚session缓存(数据清除),flush为强制与数据库同步(存入数据库))
5.testSchemaExport:让hibernate根据model配置自动创建数据库表
package com.wzy.model; import static org.junit.Assert.*; import java.util.Date; 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; public class TeacherTest { private static SessionFactory sf=null; @BeforeClass public static void beforeClass(){ sf=new AnnotationConfiguration().configure().buildSessionFactory(); } @Test public void test() { Teacher s=new Teacher(); s.setName("wzy"); s.setTitle("中级"); s.setBirthDate(new Date()); Session session=sf.getCurrentSession(); session.beginTransaction(); session.save(s); session.getTransaction().commit(); } @Test public void testdelete() { Teacher s=new Teacher(); s.setName("wzy"); s.setTitle("中级"); s.setBirthDate(new Date()); Session session=sf.getCurrentSession(); session.beginTransaction(); session.delete(s);//没有ID是删不掉的,s为瞬时状态 session.getTransaction().commit(); } @Test public void testload() { Session session=sf.getCurrentSession(); session.beginTransaction(); Teacher t=(Teacher)session.load(Teacher.class, 1);//只是做了代理,用到才会发SQL session.getTransaction().commit(); //System.out.println(t.getName()); } @Test public void testget() { Session session=sf.getCurrentSession(); session.beginTransaction(); Teacher t=(Teacher)session.get(Teacher.class, 1);//直接发SQL取数据 session.getTransaction().commit(); System.out.println(t.getName()); } @Test public void testupdate() { Session session=sf.getCurrentSession(); session.beginTransaction(); Teacher t=(Teacher)session.get(Teacher.class, 1); t.setName("ss1"); session.getTransaction().commit(); System.out.println(t.getName()); } @Test public void testupdateStudent() { Session session=sf.getCurrentSession(); session.beginTransaction(); Student t=(Student)session.get(Student.class, 1); t.setName("ss2");//由于Sudent.hbm.xml 中有dynamic-update=true 所以SQL只更新name属性 session.getTransaction().commit(); t.setName("ss3");//t为detache状态,session缓存中没有t,内存中还有t System.out.println(t.getId()); Session session2=sf.getCurrentSession(); session2.beginTransaction(); t.setName("ss4"); session2.update(t);//全部属性更新,因为session缓存中没有t对象 session2.getTransaction().commit(); } @Test public void testClear() { Session session=sf.getCurrentSession(); session.beginTransaction(); Teacher t=(Teacher)session.get(Teacher.class, 1); session.clear();//清除session缓存内容 Teacher t2=(Teacher)session.get(Teacher.class, 1); session.getTransaction().commit(); } @Test public void testFlush() { Session session=sf.getCurrentSession(); session.beginTransaction(); Teacher t=(Teacher)session.get(Teacher.class, 1); t.setName("cc"); session.flush();//强制让数据库与内存的内容同步 t.setName("cc1"); session.getTransaction().commit(); } @Test public void testSchemaExport(){ new SchemaExport(new AnnotationConfiguration().configure()).create(false, true); } @AfterClass public static void afterClass(){ sf.close(); } }4.teacher类要做一下更改:
@GeneratedValue(strategy=GenerationType.IDENTITY)是设置主键ID生成策略,mysql用的是IDENTITY,oracle用的是SEQUENCE,还有一种用表做自增TABLE很少用到
1.如果用的是ORACLE的话需要在类的@Entity下定义一下具体的SEQUENCE,不然会公用一个SEQUENCE:
@SequenceGenerator(name="teacherSEQ",sequenceName="realOracleSEQ")
2.然后在@Id下加上定义的SEQUENCE:
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
@Temporal(TemporalType.DATE)是存储日期还是时间,默认不写是存日期+时间,DATE是日期,TIME是时间
package com.wy.model; import java.util.Date; import javax.annotation.Generated; import javax.persistence.*; @Entity public class Teacher { private int id; private String name; private String title; private Date birthDate; public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }二、hibernate对象的三种状态:
1:Transient :瞬时状态 ;Persistent:持久化状态 ;Detached:脱离状态
瞬时状态:new出来还没有存入数据库的时候
持久化状态:存入数据库了还有关闭session的状态
脱离状态:session已经关闭,内存中还存在,但是session已经不指向不引用的时候
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
相关文章推荐
- 使用工具安装,运行,停止,卸载Window服务
- IP 广播转发
- Struts2学习(四)利用ajax异步上传
- 如何判断一个结构体的大小
- Apache Kafka开发入门指南(2)
- 黑马程序员-------Java笔记--------完数与质数
- Andrew Ng机器学习课程6
- [LeetCode] Palindrome Permutation II
- Apache Kafka开发入门指南(1)
- where 1=1 你爱用不用!!
- bash基础特性
- IP Traffic Export
- javascript正则表达式
- 线性表之顺序表的性能分析
- Redis学习笔记(5)
- IP Event Dampening(IP事件惩罚)
- android 中SQLite数据库多条插入提高执行效率
- PagerSlidingTabStrip的分析和使用
- CTF题目整理
- ASC和字符转化,整形和String转化