您的位置:首页 > 其它

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配置自动创建数据库表

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")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: