Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate,包括介绍Hibernate PO和Hibernate VO方面。
PO(Persistence Object )和VO(Value Object )是Hibernate中两个比较关键的概念。
首先,何谓VO,很简单,VO就是一个简单的值对象。
总结:
VO经过Hibernate进行处理,就变成了PO。
session.save(user)中,我们把一个VO “user”传递给Hibernate的Session.save方法进行保存。在save方法中,Hibernate对其进行如下处理:
1.在当前session所对应的实体容器(Entity Map)中查询是否存在user对象的引用。
2.如果引用存在,则直接返回user对象id,save过程结束. Hibernate中,针对每个Session有一个实体容器(实际上是一个Map对象), 如果此容器中已经保存了目标对象的引用,那么hibernate会认为此对象已经 与Session相关联。
对于save操作而言,如果对象已经与Session相关联(即已经被加入Session 的实体容器中),则无需进行具体的操作。因为之后的Session.flush过程中,Hibernate会对此实体容器中的对象进行遍历,查找出发生变化的实体,生成
并执行相应的update语句。
3.如果引用不存在,则根据映射关系,执行insert操作。
a) 在我们这里的示例中,采用了native的id生成机制,因此hibernate会
从数据库取得insert操作生成的id并赋予user对象的id属性。
b) 将user对象的引用纳入Hibernate的实体容器。
c) save过程结束,返回对象id.
而Session.load方法中,再返回对象之前,Hibernate就已经将此对象纳入其实
体容器中。
Hibernate VO和Hibernate PO的主要区别在于:
◆VO是独立的Java Object。
◆PO是由Hibernate纳入其实体容器(Entity Map)的对象,它代表了与数据库中某条记录对应的Hibernate实体,PO的变化在事务提交时将反应到实际数据库中。如果一个PO与Session对应的实体容器中分离(如Session关闭后的PO),那么此时,它又会变成一个VO。由Hibernate VO和Hibernate PO的概念,又引申出一些系统层次设计方面的问题。如在传统的MVC架构中,位于Model层的PO,是否允许被传递到其他层面。由于PO的更新最终将被映射到实际数据库中,如果PO在其他层面(如View层)发生了变动,那么可能会对Model 层造成意想不到的破坏。
因此,一般而言,应该避免直接PO传递到系统中的其他层面,一种解决办法是,通过一个VO,通过属性复制使其具备与PO相同属性值,并以其为传输媒质(实际上,这个VO被用作Data Transfer Object,即所谓的DTO),将此VO传递给其他层面以实现必须的数据传送。
分享到:
相关推荐
- VO对象可以由PO或其他VO对象组合而成,也可以独立存在。 - VO对象的生命周期与具体的业务流程相关,不受数据库连接的限制。 #### 四、TO (Transfer Object) 数据传输对象 **定义:** - TO主要用于在不同的系统...
DTO可能会包含多个VO对象的组合,以适应更复杂的传输需求。 这六种对象在实际项目开发中起到不同的作用,理解并正确使用它们可以帮助我们构建更加清晰、模块化的软件架构。例如,PO和DAO一起用于数据持久化,BO处理...
- **应用场景**:当需要展示给用户的信息与服务层处理的数据不完全一致时使用。 - **优势**: - 可以避免敏感信息泄露给前端。 - 更好的控制展示给用户的界面数据。 ##### 3. BO (Business Object) - **定义**:...
ant.design.pro-boot ant.design.pro管理系统初步实现 ... 对于聚合服务需要裁减拼装个服务层的,可将Servic层返回DTO组合成VO输出。 Service层、Manager层 DTO(Data Transfer Object):数据传
- **解决办法**:将这些参数封装成一个类(通常称为数据传输对象DTO或值对象VO),用该类的对象作为参数,这样不仅提高可读性,还增强了扩展性。 2. **依恋情结 (Feature Envy)** - **问题**:一个函数过于关注另...
【DTO(Data Transfer Object)模式】或VO(Value Object)模式,用于在J2EE的多层次架构中传递数据。DTO就像一个消息载体,它可以是数据模型Model的实现,帮助减少网络传输开销,并且在系统复杂化后,可能由多个...
- **VO(Value Object)**:视图对象,通常用于展示层,与DTO类似但更专注于视图展示。 **SSH整合问题** - **Session关闭**:在JSP中直接访问Session可能导致Session已关闭的问题,需要在Action或Service层处理...
VO通常表示一个具有明确语义含义的对象,而DTO则更多地用于系统间的数据传输。在SSH2项目中,这两种对象可以用来封装从数据库查询到的数据或者作为业务逻辑处理的结果。例如,VO可以在Service层和DAO层之间传递,而...
- POJO是DO、DTO、BO、VO的统称,禁止命名为`xxxPOJO`。 #### 常量定义 18. 长整型数值在赋值时,使用大写的`L`。 19. 不允许使用一个常量类维护所有的常量,应按常量功能进行归类分开维护。 20. 常量复用层次分为...
在数据建模中,Model、Domain Object和DTO之间存在一定的关系。在系统设计初期,这三者往往是一致的,但随着系统复杂性的增加,DTO可能会由多个Model组合而成,以适应更复杂的业务需求。 MDA(Model Driven ...
DTO(Data Transfer Object)模式,也称为VO(Value Object)模式,主要用于在J2EE的多层架构之间传递数据。DTO就像一个信使,它封装了业务逻辑处理所需的数据,并在不同层之间进行传输。在系统复杂性增加时,一个...
- **避免随意缩写**:命名时尽量使用完整单词组合,避免使用不常见的缩写。 - **正例**:`PullCodeFromRemoteRepository` - **设计模式体现**:在命名中体现所使用的设计模式,有助于理解和维护。 - **正例**:`...
- 特殊情况除外:DO(Data Object)、BO(Business Object)、DTO(Data Transfer Object)、VO(View Object)、AO(Application Object)、BLL(Business Logic Layer)、DAL(Data Access Layer)等。...
- 类名应采用UpperCamelCase风格,但领域模型相关的类名(如DO/BO/DTO/VO)除外。 - 方法名、参数名、成员变量和局部变量应使用lowerCamelCase风格。 - 常量命名应全部大写,并用下划线分隔单词,命名应尽可能清晰...
初始阶段,三者可能是一致的,但随着系统复杂性的增加,DTO可能会成为多个Model的组合。 **MDA(Model-Driven Architecture)与Model** MDA是一种以模型为中心的软件开发方法,它强调模型的转换和执行。Model在MDA...