### Hibernate4实战之第七部分:最佳实践 #### 设计细颗粒度的持久类并使用`<component>`实现映射 在Hibernate中,细颗粒度的持久类是指将实体中的复杂属性拆分成单独的对象进行管理。例如,对于一个用户实体中的地址信息,可以将其设计为一个独立的`Address`类,该类包含`street`、`suburb`、`state`和`postcode`等属性。这样做不仅有助于提高代码的复用性和可维护性,还能够简化未来进行代码重构时的工作量。 #### 声明标识符属性 在Hibernate中,标识符属性是用于唯一标识一个实体的字段,通常被称为`id`或`primary key`。尽管在Hibernate中标识符属性不是强制性的,但强烈推荐使用它们。标识符应当是“人造”的,即由系统自动生成,不携带任何业务逻辑上的意义。这样做的好处包括: - **一致性**:确保在整个应用程序中实体的唯一标识符保持一致。 - **易用性**:简化了实体间的关联管理。 - **安全性**:避免了因为使用具有业务意义的标识符而可能引发的安全问题。 #### 使用自然键 除了标识符属性外,还可以使用自然键来唯一确定一个实体。自然键通常是实体中具有实际业务意义的属性组合。例如,在一个客户实体中,自然键可能是客户的姓名和邮箱地址的组合。使用自然键并通过`<natural-id>`标签进行映射可以确保实体的唯一性,并且有助于优化查询性能。 #### 为每个持久类编写单独的映射文件 为了更好地组织代码和简化团队协作,建议为每个持久类创建单独的映射文件。例如,对于`com.eg.Foo`类,其映射文件应命名为`com/eg/Foo.hbm.xml`。这种方式有助于提高代码的可读性和可维护性。 #### 把映射文件作为资源加载 在部署应用时,应将映射文件与其对应的实体类一起打包。这样可以确保在不同的环境中映射文件和实体类能够正确匹配,同时也有助于简化部署过程。 #### 考虑将查询字符串置于程序外部 如果查询语句中包含了非标准SQL函数,则可以考虑将这些查询字符串放在映射文件或其他配置文件中,而不是硬编码在程序代码里。这样做的好处在于提高了程序的可移植性和可维护性。 #### 使用绑定变量 为了提高安全性并避免SQL注入攻击,建议在查询语句中使用占位符(如`?`)来代替具体的值,并通过`setParameter`方法来设置这些值。此外,Hibernate还支持命名参数,这使得查询语句更加清晰易懂。 #### 避免手动管理JDBC connections 虽然Hibernate允许应用程序自行管理JDBC connections,但这并不是一种推荐的做法。如果确实需要自定义connections管理机制,可以考虑实现`org.hibernate.connection.ConnectionProvider`接口。然而,通常情况下,使用Hibernate内置的connections provider更为合适。 #### 考虑使用用户自定义类型 当需要持久化某些来自第三方库的Java类型时,如果这些类型没有提供适当的getter和setter方法,可以考虑实现`org.hibernate.UserType`接口来定义自定义类型。这样可以在不修改原有类的情况下完成持久化任务。 #### 在性能瓶颈处使用硬编码的JDBC 尽管直接使用JDBC可能带来性能提升,但在决定采用这种方法之前,应先进行性能测试以确认其必要性。若确实需要使用JDBC,则可以通过`Session`获取`Connection`,以便保持事务一致性。 #### 理解Session的刷新机制 在Hibernate中,`Session`会在特定条件下将内存中的状态同步到数据库,这一过程称为“刷新”。频繁的刷新操作会影响性能。可以通过调整刷新策略(如禁用自动刷新)来减少不必要的刷新次数,从而优化性能。 #### 在三层结构中使用托管对象 在典型的三层架构(如servlet/session bean架构)中,可以通过在不同的层之间传递已加载的持久对象来提高效率。例如,在service层处理完业务逻辑后,可以将对象传递给presentation层显示。为了避免脏读或并发问题,建议在每次请求开始时使用新`Session`并调用`Session.merge()`或`Session.saveOrUpdate()`来与数据库同步。 #### 在两层结构中使用长持久上下文 在两层架构下,为了提高可扩展性,可以考虑使用长持久上下文。在这种情况下,可以将`Session`与JDBC connection分离,以便在需要时重新连接。但是需要注意的是,不应将同一个`Session`用于不同的应用程序事务,以免数据过期。 #### 正确处理异常 在Hibernate中,异常被视为不可恢复的错误。这意味着一旦抛出异常,当前的`Session`和事务状态都变得不可靠。因此,在捕获异常后,应确保关闭`Session`并回滚事务,以防止后续操作中出现意外行为。
- 粉丝: 5
- 资源: 163
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助