博客
关于我
Hibernate——Session(二)详解
阅读量:798 次
发布时间:2023-03-31

本文共 2506 字,大约阅读时间需要 8 分钟。

HibernateSession的三种状态及数据库操作

在Hibernate框架中,Session对象的状态对于数据库操作至关重要。了解Session的三种状态(瞬态、持久、脱管)可以帮助我们更好地管理数据库事务和对象生命周期。

1. 瞬态(Transient State)

瞬态对象是通过new命令创建的对象,例如:

User user = new User();

瞬态对象的特点:

  • 对象未与任何Session关联
  • 对应的数据库记录不存在或与瞬态对象无关
  • 2. 持久状态(Persistent State)

    持久对象是通过Session的持久化操作(如save()saveOrUpdate())将瞬态对象与数据库关联后得到的对象。持久对象的特点:

  • 对应的数据库记录存在,并且具有持久化标识(identifier)
  • 持久对象总是与当前Session和Transaction相关联
  • 在Transaction未提交(commit())之前,持久对象可能处于脏状态(dirty对象)
  • 持久对象的状态同步:

    • 在提交Transaction之前,持久对象的状态可能与数据库不一致
    • 只有在Transaction提交时,才会向数据库同步持久对象的状态

    3. 托管状态(Detached State)

    当持久对象所在的Session被关闭或清除时,持久对象变为脱管状态。脱管对象的特点:

  • 对应的Session已关闭
  • 对应的数据库记录仍然存在
  • 对象的引用仍然有效,可以继续修改
  • 脱管对象与持久对象的区别:

  • 托管对象本质上与瞬态对象相同
  • 托管对象仅多了一个数据库标识符(identifier)
  • 数据库操作

    在Hibernate中,Session对象通过数据库操作实现数据的增删改查。以下是常见的数据库操作类型及其实现方法:

    1. 插入(Insert)

    新建一个Java Web项目,导入Hibernate相关jar包,创建相应的model包,新建User类,并创建User.hbm.xml文件。通过以下步骤实现数据插入:

    public static void main(String[] args) {    Configuration config = new Configuration();    config.configure("/hibernate.cfg.xml");    SessionFactory sessionFactory = config.buildSessionFactory();    Session session = sessionFactory.openSession();    Transaction tx = session.beginTransaction();        User user = new User();    user.setUsername("乔丹");    user.setUserpass("123");    session.save(user);    tx.commit();    session.close();}
    2. 删除(Delete)
    public static void main(String[] args) {    Session session = HibernateSessionFactory.getSession();    Transaction tx = session.beginTransaction();        User user = (User) session.get(User.class, new Integer(2));    session.delete(user);    tx.commit();    session.close();}
    3. 更新(Update)
    public static void main(String[] args) {    Session session = HibernateSessionFactory.getSession();    Transaction tx = session.beginTransaction();        User user = (User) session.get(User.class, new Integer(2));    user.setUsername("皮蓬");    tx.commit();    session.close();        // 重新获取Session    session = HibernateSessionFactory.getSession();    tx = session.beginTransaction();    session.update(user);    tx.commit();    session.close();}
    4. 查询(Query)

    通过Session的get()load()方法查询数据:

    public static void main(String[] args) {    Session session = HibernateSessionFactory.getSession();    Transaction tx = session.beginTransaction();        User user = (User) session.get(User.class, new Integer(2));    tx.commit();    session.close();}
    5. 数据库状态管理
    • 持久化对象:持久化对象与Session和Transaction关联,一次事务内的所有操作要么成功要么失败。
    • 脱管对象:脱管对象的Session已关闭,对象状态独立于Session。
    • 瞬态对象:未与数据库关联,仅在内存中存在。

    通过合理管理Session状态,可以有效地进行数据库操作,确保数据一致性和完整性。

    转载地址:http://mpefk.baihongyu.com/

    你可能感兴趣的文章
    OpenWrt固件编译刷机完全总结
    查看>>
    Open××× for Linux搭建之二
    查看>>
    Open×××有线网络时使用正常,无线网络时使用报错的解决方案
    查看>>
    ORA-00942 表或视图不存在
    查看>>
    ORA-01795: 列表中的最大表达式数为 1000
    查看>>
    ora-12541:tns:no listener
    查看>>
    【docker知识】联合文件系统(unionFS)原理
    查看>>
    ORACEL学习--理解over()函数
    查看>>
    oracle 10g crs命令,Oracle 10g CRS安装问题解决一例
    查看>>
    oracle 10g的安装配置
    查看>>
    Oracle 11g 使用RMAN备份数据库
    查看>>
    Oracle 11gR2学习之二(创建数据库及OEM管理篇)
    查看>>
    Oracle 11g中的snapshot standby特性
    查看>>
    Oracle 11g忘记sys、system、scott密码该这样修改!
    查看>>
    Oracle 11g数据库安装和卸载教程
    查看>>
    Oracle 11g超详细安装步骤
    查看>>
    Oracle BEQ方式连接配置
    查看>>
    ORACLE Bug 4431215 引发的血案—原因分析篇
    查看>>
    oracle dblink 创建使用 垮库转移数据
    查看>>
    oracle dblink结合同义词的用法 PLS-00352:无法访问另一数据库
    查看>>