package com.hibernate.test;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
import com.hibernate.domain1.Person;
public class PersonTest {
private static SessionFactory sessionFactory;
// 静态代码块
static {
Configuration configuration = new Configuration();
// 加载配置文件
configuration.configure("hibernate.cfg.xml");
// 创建服务器注册对象
// 创建服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.buildServiceRegistry();
// 采用了工厂模式创建sessionFactory
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
@Test
public void testSavePerson() {
// 打开session
Session session = sessionFactory.openSession();
// 事务开始
Transaction transaction = session.beginTransaction();
Person person = new Person();
// 由于在映射文件中已经说明主键的产生方式是hibernate内部产生,所以在程序中不用设置主键
person.setPname("王大炮");
person.setPsex("男");
// 保存person对象到数据库中
session.save(person);
// 提交事务
transaction.commit();
// 关闭session
session.close();
}
// 修改
@Test
public void testUpdatePerson() {
// 打开session
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
/*
* 1.先把修改的那行提取出来 说明, Serializable是String和包装类共同的父类session.get(clazz,
* id);// clazz是字节码,id是Serializable,id=1L,则这个id的类型一定要和Person类中对应的类型匹配
* 那么把第二个参数定义为Serializable则好处是既能接受基本类型的包装类又可以接受string类
*/
// java的反射机制调用Java类的默认的构造函数,必须存在
Person person = (Person) session.get(Person.class, 1L);// 1L代表是Long类型,这里的id类型要和Person类中对应的类型匹配
person.setPsex("不详");
session.update(person);
transaction.commit();// 提交事务
session.close();
}
// 查询 无需事务
@Test
public void testQuery() {
Session session = sessionFactory.openSession();
List<Person> personList = session.createQuery("from Person").list();
System.out.println(personList.size());
}
// 删除,两种方式
@Test
public void testDelete() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// 方式一,先从中获取指定的id对象.推荐
Person person = (Person) session.get(Person.class, 1L);
session.delete(person);
// 方式二,创建一个新的person对象
// Person person2 = new Person();
// person2.setPid(1L);
// session.delete(person2);
transaction.commit();
session.close();
}
}
注意:
只有查询操作无需事务干预,其他的三个(添加,修改,删除)需要事务干预