`
tenn
  • 浏览: 576240 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

实体映射策略

阅读更多
一,实体粒度设计

fine-grained object model

grained object model(细粒度模型):就是将原本业务模型中的对象加以细分,从而得到更加精细的对象模型(也就是划分出更多的对象)。对于Hibernate主要是针对实体类设计的对象细分。

对象的细分目的:
1,面向设计的粒度细分:通过对象细化,实现更加清晰的系统逻辑。
2,面向性能的粒度细分:针对业务逻辑,通过合理的细粒度对象,提高系统的能耗比(性能/资源消耗)。

(一),面向设计粒度细分
例如:配送单包含信息---订购客户姓名,所订购的货物品名、数量,配送单编号、配送地址、配送时间。
设计方法1,通过一个大型的“配送单”对象容纳所有的属性。
设计方法2,将其划分为3个对象:
1,User(String name);2,Item(String name,int count);3,Invoice(String serial,String address,Datetime datetime)
-----体现了更加清晰和合理的设计逻辑。(多表查询性能消耗怎么办?---将单表划分为多个对象,不是多个表,OK?)
对于单表的对象细分,在Hibernate中借助Component节点的定义完成。
Component--组件,从属于某个整体的一个组成部分。在Hibernate中,将某个实体对象中的一个逻辑组成称为Component。与实体对象的根本差别在于Component没有标识(identity)。它作为一个逻辑组成,完全从属于实体对象。---也可以理解为实体对象的属性。

T_User
id        int    <pk>
firstname varchar(50)
lastname  varchar(50)
address   varchar(50)
zipcode   varchar(10)
tel       varchar(20)
通过Component定义,将单表T_User映射到了3个类TUser,Contact和Name。---在传统关系型库表上,实现了面向对象的领域划分。

TUser.java
public class TUser implements Serializable{
    private Integer id;
    private Contact contact;
    private Name name;

    ......getter/setter......
}

Contact.java
public class Contact implements Serializable{
    private String address;
    private String zipcode;
    private String tel;

    ......getter/setter......
}

Name.java
public class Name implements Serializable{
    private String firstname;
    private String lastname;
   
    ......getter/setter......
}

Hibernate中通过Component节点对组件进行声明:
<hibernate-mapping>
  <class name="TUser" table="T_User">
    <id name="id" column="id" type="java.lang.Integer">
      <generator class="native"></generator>
    </id>
    <component name="name" class="Name">
      <property name="firstname" type="string" column="firstname"/>
      <property name="lastname" type="string" column="lastname"/>
    </component>
    <component name="contact" class="Contact">
      <property name="address" type="string" column="address"/>
      <property name="zipcode" type="string" column="zipcode"/>
      <property name="tel" type="string" column="tel"/>
    </component>
  </class>
</hibernate-mapping>

(二),面向性能的粒度细分
---针对业务逻辑,通过合理的细粒度对象,提高系统的能耗比(性能/资源消耗)。

实体类TUser
public class TUser implements Serializable{
    private Integer id;
    private String name;
    private Integer age;

    private Blob image;
    private Clob resume;

    ...getter/setter...
}

“重量级”字段类型,应该在确实需要显示的时候再读取。---Hibernate3提供了属性的延迟加载功能,通过这个功能,我们可以在调用TUser.getResume/getImage时才真正从数据库中读取数据。Hibernate2在继承层次上的粒度划分--将TUser对象拆分为TUserInfo和TUserProfile。

public class TUserInfo implements Serializable{
    private Integer id;
    private String name;
    private Integer age;

    ...getter/setter...
}
public class TUserProfile extends TUserInfo implements Serializable{
    private Blob image;
    private Clob resume;

    ...getter/setter...
}
通过继承关系,将一个对象进行纵向细分。---对于无需操作大对象而言就通过TUserInfo对数据进行加载,对于需要处理大对象就通过TUserProfile进行处理。

TUserInfo.hbm.xml
<hibernate-mapping>
  <class name="TUserInfo" table="T_User">
    <id name="id" column="id" type="java.lang.Integer">
      <generator class="native">
      </generator>
    </id>
    <property name="name" column="name" type="java.lang.String">
     <property name="age" column="age" type="java.lang.Integer">
  </class>
</hibernate-mapping>

TUserProfile.hbm.xml
<hibernate-mapping>
  <class name="TUserProfile" table="T_User" ploymorphism="explicit">
    <id name="id" column="id" type="java.lang.Integer">
      <generator class="native">
      </generator>
    </id>
    <property name="name" column="name" type="java.lang.String"/>
    <property name="age" column="age" type="java.lang.Integer"/>
    <property name="image" column="image" type="java.sql.Blob"/>
    <property name="resume" column="resume" type="java.sql.Clob"/>
  </class>
</hibernate-mapping>
通过polymorphism="explicit"声明了一个显示多态关系。声明为显示多态的类,只有在明确指定类名的时候才会返回此类实例。如:
List objects = createQuery("from TUserProfile").list();

总结:实体粒度设计主要细化手段:1,将一个表映射为多个类,各实体类彼此独立,一个主类,其余类为主类的属性,在映射文件上表现为主类的组件(Component),组件从属于主类;2,采用继承纵向细分,细分的类具有继承关系,实体类映射文件各自独立,子类映射文件声明polymorphism="explicit"。

分享到:
评论
1 楼 fishswing 2009-04-24  
楼主好文章。特别是“面向性能的粒度细分 ”,看了后受益匪浅。
但是我也有个问题不太明白,举个例子来说:我的两张表,
BaseDoc有三个字段:fileid,filename,filecontent,accer后面两个字段是blob类型的,
现在把这张表的实体类分成两个实体
BaseDoc 有 fileid和filename两个属性,
BaseDocProfile 有filecontent,accer两个字段,
映射文件也像你上面样配置好了。

现在我有另一张表 Userinfo有uid,uname,uage,fileid
这张表引用了BaseDoc的主键fileid列,映射实体时就是一对多的关系了。
那这张表的实体类就有一个BaseDoc表的实体类对象,现在这个实体类应该是BaseDoc还是BaseDocProfile。而我要查询这个用户下有那些文件的时候有两种情况,
      1,是只查询fileid和filename
     2,有时候又需要把filecontent,fileaccer两个blob字段的内容一起查出来
如果Userinfo类包含的对象是BaseDoc的话,遇到第2种情况时,就不能查询到filecontent和fileaccer了。
如果Userinfo类包含的对象是BaseDocProfile的话,那在第1种情况下,每回查询时都会把filecontent和fileaccer查询出来。

遇到这种情况时,应该怎么处理呢?

相关推荐

    FastMapper:强大的基于约定的、可定制的和最快的对象-对象映射工具。它对实体到 DTO、DTO 到实体映射策略很有用

    它对于实体到 DTO、DTO 到实体映射策略很有用。 ###我在哪里可以得到它? 可以在 NuGet 上找到最新版本 PM&gt; Install-Package FastMapper ###入门 ####映射到新对象 FastMapper 创建对象并将值映射到它。 ...

    Hibernate实体映射

    本资源“Hibernate实体映射”提供了一个深入理解这一关键概念的机会,通过实例代码和教程笔记,帮助学习者更好地掌握Hibernate的核心功能。 一、Hibernate实体映射基础 在Hibernate中,实体映射是将Java对象模型与...

    注解框架实体类映射

    Hibernate支持多种注解,如@Entity表示该类为数据库表的实体,@Table定义表名,@Id标识主键,@GeneratedValue指定主键生成策略,@Column定义字段与列的对应,@OneToMany、@ManyToOne、@OneToOne和@ManyToMany则用于...

    hibernate实体映射文件字段设置默认值

    ### Hibernate实体映射文件字段设置默认值 在Hibernate框架中,实体映射文件(通常为`.hbm.xml`)用于定义Java对象与数据库表之间的映射关系。这其中包括了属性到数据库表列的映射、主键生成策略、以及一些高级特性...

    ado.net Entity Framework学习 CSEFEntityDataModel

    - **One2One、TableMerging、TablePerType、TablePerHierarchy、TableSplitting**:这些可能是不同的目录,分别代表了不同类型的实体映射策略: - **One2One**:一对一关系的示例。 - **TableMerging**:表合并,...

    JPA学习笔记帮助文档

    #### 一、继承与实体映射策略 在Java Persistence API (JPA)中,实体的继承模型是非常重要的一个概念,它允许开发人员以灵活的方式组织和存储实体类的层次结构。JPA支持三种主要的继承映射策略:`SINGLE_TABLE`、`...

    HIbernate PPT

    最后,集合映射和实体映射策略展示了如何在Hibernate中处理复杂的数据结构。 【标签】:“Hibernate PPT”标签明确了这些内容是关于Hibernate的,这是一款强大的Java持久层框架,通过ORM技术简化了数据库操作。 ...

    ItcastOA_文档2_实体映射_分页方案_文件下载_解决异常.doc

    ### ItcastOA_文档2_实体映射_分页方案_文件下载_解决异常 #### 一、实体映射 实体映射是IT项目开发中非常重要的环节之一,特别是对于那些涉及复杂数据交互的应用程序来说更是如此。在本节中,我们将详细探讨...

    java根据实体类生成Hibernate映射文件

    需要注意的是,这只是一个基本的实现,实际的生产环境中可能需要处理更复杂的情况,如自定义生成策略、关联关系映射、枚举类型等。此外,对于大型项目,通常会使用代码生成工具(如MyBatis的MyBatis Generator或...

    mysql数据库表映射实体生成

    MySQL数据库表映射实体生成是一种常见的开发任务,特别是在Java企业级应用中,它涉及到ORM(对象关系映射)技术,如Hibernate或MyBatis。这个工具类的目标是自动化将数据库中的表结构转换为编程语言中的实体类,这样...

    JPA实体映射对时间字段的处理

    例如,在使用`java.util.Date`时,若数据库中的字段类型为`java.sql.Date`,则可能需要调整映射策略: ```java @Temporal(TemporalType.DATE) ``` 改为 ```java @Temporal(TemporalType.TIMESTAMP) ``` 或者直接...

    推荐一款Java实体映射工具---mapstruct(csdn)————程序.pdf

    MapStruct 是一个强大的Java实体映射工具,它旨在简化对象之间的转换过程,特别是在处理大量属性映射时。传统的手动设置属性或使用BeanUtils.copyProperties()方法可能会效率低下,且易出错。MapStruct通过注解...

    用MyEclipse自动生成hibernate映射文件和实体类

    在使用Hibernate框架进行对象关系映射(ORM)时,MyEclipse提供了自动生成映射文件和实体类的功能,极大地简化了数据库与Java类之间的绑定工作。以下是详细步骤和相关知识点: 1. **DB Browser视图**:在MyEclipse...

    myibatis 生成oracle 对应映射文件

    `jdbcConnection`元素用于设置JDBC连接属性,而`javaModelGenerator`元素则定义了实体类的生成位置和生成策略。 此外,还有`sqlMapGenerator`和`javaClientGenerator`元素,分别用于生成XML映射文件和Mapper接口。...

    Hibernate教程09_关系映射之组件映射

    组件映射是Hibernate中的一种高级映射策略,用于将一个类的属性组织成一个逻辑组件,这个组件可以有自己的持久化属性。 首先,我们需要理解什么是组件(Component)。在Hibernate中,组件通常是一个没有独立生命...

    mybatis-generator-数据库表映射实体,生成mapper.xml,适用于mybatis-puls

    适用于java,数据库表映射实体,mapper.xml。 比原版本新增:实体类中添加了@Data lombok注解;添加了Myabtis-plus中的注解@TableName和@TableField;添加了sql中对字符串的空判断,之前只有null判断;DAO层继承了...

    generator自动生成Mybatis实体以及映射文件

    Mybatis Generator是一款强大的工具,它能够自动化生成Mybatis框架所需的实体类、Mapper接口与XML映射文件,大大减轻了开发人员的手动编码工作,提高了开发效率。本篇将详细介绍generator的使用及其背后的原理。 ...

    一种面向电动汽车控制的AUTOSAR可运行实体任务映射方法.pdf

    总结来说,本研究为电动汽车控制软件的设计和开发提供了一种具有实践指导意义的创新映射策略。通过优化任务调度和数据处理,显著提高了电动汽车控制系统的性能和效率。这种基于AUTOSAR架构的任务映射方法,不仅提高...

    mybaties自动生成实体类及映射文件

    同时,你可以设置需要生成实体类和映射文件的表名,以及自定义生成规则,比如字段命名策略、是否生成注释等。 实体类(Entity Class)是Java对象,代表数据库中的表记录。MBG会为每个表生成对应的实体类,其中包含...

Global site tag (gtag.js) - Google Analytics