Hibernate 之 创建数据库对象
Session
其实session相当于hibernate当中连接数据库的一个媒介,它就是一个操作数据库的对象。
session与connection,是多对一的关系。把对象保存在关系数据库中需要调用session的各种方法,如:save()、update()、delete()、createQuery()等。
如何获得session对象?
openSession
getCurrenSession(!这种方式需要在配置文件汇总进行配置,否则将会报错)
如果是本地事务(jdbc事务)
thread
如果是全局事务(jta事务)
jta
两者的区别:
- getCurrenSession在事务提交或者回滚之后会自动关闭,而openSession需要手动关闭。如果使用openSession而没有手动关闭,多次之后会导致连接池溢出。
- openSession每次创建新的session对象,而getCurrentSession使用现有的session对象。
transaction
- hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交的方式。所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中。 !!一定要记得开启事务
单一主键
- assigned 由java应用程序负责生成(手工赋值);
- native 由底层数据库自动生成标志符,如果是MySQL就是increment,如果是Oracle就是sequence,等等。
组件属性
- 实体类中的某个属性属于用户自定义的类的对象。
- 个人理解:在原来的表结构基础上增加了用户自定义的字段。
<component name="address" class="Address">
<property name="postcode" column="POSTCODE"></property>
<property name="phone" column="PHONE"></property>
<property name="address" column="ADDRESS"></property>
</component>
单表CRUB操作实例
- save 保存对象
- update 修改对象
- delete 删除对象
- get/load (查询单个记录)
应该将所有操作完成以后再提交事务。
public class SchoolCourseTest {
private SessionFactory seesionFactory;
private Session session;
private Transaction transaction;
public static void main(String[] args) {
SessionFactory seesionFactory;
Session session;
Transaction transaction;
Configuration cfg;
ServiceRegistry serviceRegistry;
Timestamp time = new Timestamp(System.currentTimeMillis());
SchoolCourse sc = new SchoolCourse(5,"算法分析",2,1,time,"cxz","none");
// sc.setId(4);
// sc.setCourseName("JAVA");
// sc.setSchoolTerm(1);
// sc.setStatus(2);
// sc.setCreatedDate(time);
// sc.setCreater("cxz");
// sc.setMemo("none");
//获得配置对象
cfg = new Configuration().configure();
//获得服务注册独享
serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
//获得seesionFactory对象
seesionFactory = cfg.buildSessionFactory(serviceRegistry);
//获得session对象
session = seesionFactory.openSession();
transaction = session.beginTransaction();
//save 保存对象
// session.save(sc);
//get / load(查询单个对象)
sc = (SchoolCourse)session.get(SchoolCourse.class,1);
System.out.print(sc);
sc = (SchoolCourse)session.load(SchoolCourse.class,2);
System.out.print(sc);
//update 更新对象
sc = (SchoolCourse)session.get(SchoolCourse.class,3);
sc.setMemo("update");
System.out.print("memo:"+sc.getMemo());
session.update(sc);
//delete 删除对象
sc = (SchoolCourse)session.get(SchoolCourse.class,7);
session.delete(sc);
//提交事务
transaction.commit();
//关闭会话对象
session.close();
}
}