理解Hibernate中newInstance()与new的关键区别与类加载机制

需积分: 9 1 下载量 14 浏览量 更新于2024-08-23 收藏 2.51MB PPT 举报
在Hibernate基础教程中,第9个主题主要讲解如何编写测试类以及关于Java对象生命周期和ORM操作的理解。首先,我们来理解`newInstance()`方法与`new`关键字在创建对象上的差异。 `newInstance()`方法是一种特殊的方法,通常用于创建特定类的实例,但该方法依赖于类的加载机制。当调用`newInstance()`时,JVM会确保该类已经被加载到内存中,并且如果使用的是`Class.forName()`,还会确保类已连接到当前的类加载器。这种方式有助于提高软件的可扩展性和重用性,因为它可以在运行时动态加载类,而无需在编译时就确定所有的类。 相比之下,使用`new`关键字创建对象是在编译时确定的,这意味着即使类尚未被加载,JVM也能通过预先存在的类信息构造对象。然而,这可能导致潜在的类加载问题,特别是当涉及到依赖注入或者动态代理等场景时。 接下来,我们转向Java事务API(JTA),Hibernate提供了对这些API的支持。在Hibernate中,对象可以处于不同的状态,如游离状态(Transient)、持久化状态(Persistent)和锁定状态(Locked)。游离状态的对象(如未保存或从数据库查询获取的实例)可以通过`save()`、`persist()`或`saveOrUpdate()`方法将其变为持久化状态,此时会触发相应的SQL操作,如INSERT、UPDATE或DELETE。删除持久化对象则通过`delete()`实现,而`update()`或`merge()`则用来更新已有数据。 对于已持久化的实例,任何对其的修改都会在刷新或提交事务时被检测到并自动进行SQL UPDATE。`replicate()`函数用于复制对象,可能会触发INSERT或UPDATE操作,具体取决于当前对象的状态。 查询操作也是教程的一部分,例如,使用`session.createSQLQuery()`可以执行自定义SQL查询,返回的结果集(List类型)可以通过索引获取单个对象(如`objs.get(0)`),然后进行进一步的操作,如打印对象内容。 这部分教程详细阐述了在使用Hibernate时如何编写测试类,涉及类加载机制、对象状态管理以及基本的数据库操作。理解和掌握这些概念对于开发高质量的Hibernate应用至关重要。