public class testAdd extends hibernateUtil{
@Test
public void testAddPerson(){
//为了防止代码重写太多次,我们把前面三步放在utils里面。
//得到session,注意,这里的session与jsp的session不同
Session session=sessionFactory.openSession();
//开启事务
Transaction transaction=session.beginTransaction();
//创建新对象
Person person=new Person();
//设置值,为什么不设置id?因为在映射文件中定义了主键的生成方式为increment
person.setPname("andy");
//保存
session.save(person);
//提交事务
transaction.commit();
//关闭连接
session.close();
}
@Test
public void testQuery(){
//查询不用开启事务
Session session=sessionFactory.openSession();
//这里使用的是hql语句,需要注意的是,这里的from Person 用的是POjo的名字,所以也要大写
//.list()是把里面的数据封装到list里面
List<Person> persons=session.createQuery("from Person").list();
for(Person person:persons)
System.out.println(person.getPname());
session.close();
}
@Test
public void testQuery_Id(){
Session session=sessionFactory.openSession();
//因为我们在存储的时候,id的类型是Long,所以在后面加上L,否则会类型不匹配,
Person person=(Person) session.get(Person.class, 1L);
System.out.println(person.getPname());
session.close();
}
@Test
public void testUpdate(){
Session session=sessionFactory.openSession();
//由于修改,需要用到事务,所以我们先开启事务
Transaction transaction=session.beginTransaction();
//修改有两种方法,
//a)先查找出来,再修改
//这里需要注意的是,session.get方法,里面的对象,一定要有一个空参的构造方法,因为该方法是hibernate利用反射技术来生成对象的!
// Person person=(Person) session.get(Person.class, 1L);
// person.setPname("ansel2");
//b)先创建对象, 然后设置对象的Id与要修改对象一致,
Person person=new Person();
//其中第二种方法比较麻烦,因为这个对象是自己创建的,需要重新把里面的其他值也赋值到,如果对象一多,就废了,使用这种方法的前提是,session缓存中,只有一个id为2L的对象,否则会报错(不同的对象有一样的id)
person.setPid(2L);
person.setPname("andy2");
//在这里要记住用session来save,并且这里的Person必须与映射文件的Person对应,否则会报错,详情看最下面的注释1中的内容
session.update(person);
//提交事务
transaction.commit();
//关闭session
session.close();
}
@Test
public void testDelete(){
Session session=sessionFactory.openSession();
//由于删除需要用到事务,所以我们先开启事务
Transaction transaction=session.beginTransaction();
//这时候,跟上面修改一样,可以先先拿出来再删,也可以创建对象删
//这里可以使用创建对象删除,因为只需要知道主键,其他内容都已经没关系了,因为要删除了
Person person=new Person();
person.setPid(2L);
session.delete(person);
transaction.commit();
session.close();
}
}
注释1:
如果这个时候,我们把cn.ansel.domain的Person复制到当前包中,并且把刚刚倒入的cn.ansel.domain.Person去掉,在运行,就会报错,错误如下:
在之前一个贴说过,hibernate是根据映射文件中的class属性类判断一个类是否为pojo,这里的Person与映射文件中的Person不一样,并且在当前测试包下的Person也没有配置到映射文件上,所以会报出未知的实体 这个错误。