Hibernate继承策略解析:单表与具体表继承

需积分: 9 1 下载量 37 浏览量 更新于2024-08-23 收藏 2.51MB PPT 举报
"关于Hibernate基础教程中的继承实现策略以及对象状态管理" 在Hibernate框架中,继承是用于建模对象层次结构的重要手段,它提供了三种不同的策略来处理继承关系映射到数据库的关系模型。这些策略包括: 1. **单表继承(Single Table Inheritance)**: 在这种策略下,所有继承类的数据都存储在一个共享的表中。表的字段会包含所有子类可能需要的属性,即使某个子类并不使用某些属性。标识符(ID)字段用于区分不同类型的子类实例。这种策略的优点是减少了数据库表的数量,但可能导致数据冗余。 2. **具体表继承(Concrete Table Inheritance)**: 每个子类都有自己的独立表,而超类的信息则存储在一个单独的超类表中。子类表通过主键与超类表建立一对一关联。这种方法避免了单表继承中的数据冗余,但可能会增加数据库表的数量。 3. **每个具体类一个表( Joined Subclass Inheritance)**: 这种策略结合了前两者的特点,每个子类都有自己的表,同时超类的公共属性依然保存在一个单独的表中。子类表通过外键关联到超类表。这种策略适用于有大量子类并且每个子类都有很多特定属性的情况。 在Java编程中,创建对象有两种常见方式:`new` 关键字和 `newInstance()` 方法。`new` 关键字直接创建一个新的对象实例,而 `newInstance()` 是基于反射的,它需要类已经被加载并连接到JVM。`newInstance()` 方法在动态加载类或在不确定具体类的情况下非常有用,例如在插件系统中。 Java事务API(JTA)是Java平台上的标准事务管理接口,用于管理分布式事务。在Hibernate中,对象有不同的状态,如: - **游离状态(Detached)**:对象不在Session管理下,但之前曾是持久化状态。 - **持久化状态(Persistent)**:对象与数据库中的记录对应,Session管理其生命周期。 - **临时状态(Transient)**:对象刚被创建,尚未与Session关联。 - **已删除状态(Removed)**:对象从Session中移除,即将从数据库中删除。 对象状态的转换操作包括: - 游离状态可以通过`save()`, `persist()`, 或 `saveOrUpdate()` 恢复为持久化状态。 - `delete()` 方法将持久化对象标记为已删除,下次提交时会执行SQL DELETE。 - `get()` 和 `load()` 返回的都是持久化状态的对象。 - 游离状态的实例可以用 `update()`, `saveOrUpdate()`, `lock()`, 或 `replicate()` 重新变为持久化。 - `merge()` 方法会复制游离对象的状态到一个新创建的持久化实例。 在查询方面,Hibernate提供HQL(Hibernate Query Language)和SQL直接查询。示例中的HQL查询是: ```sql select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_, this_.sex as sex0_0_ from Person this_ where (this_.name=? and this_.sex=?) ``` 而使用`createSQLQuery()`方法则可以直接执行原生的SQL查询,如: ```java List objs = (List) session.createSQLQuery("SELECT * FROM Person").list(); Object[] o = (Object[]) objs.get(0); ``` 以上代码从Person表中获取所有记录,并打印出第一行数据。