以下例子:
-------------Book表(相应的model为Book)----------------------------
bookId,
title,
authorId(作者表)
------------------------------------------------------------------
-------------Author表(相应的model为Author)----------------------------
authorId,
authorName
------------------------------------------------------------------
那么我建立Book表的model层的时候,该怎样建立?
第一种:public class Book{
private int bookId;
private String title;
private authorId;
..相应的get和set
}第二种:public class Book{
private int bookId;
private String title;
private Author author(区别在这);
..相应的get和set
}该用哪种方式定义Book呢
说明一下,我的数据库框架是ibatis,
如果用第一种的话,直接用resultClass就可以,很简单: <select id="selectBookById" parameterClass="java.lang.Integer" resultClass="Book">
 select * from bs_book  where bookId=#bookId#
</select>如果我使用第二种的话,要是查询的话,我得使用resultMap:<resultMap class="Book" id="BookMap">
    <result property="bookId" column="bookId" />
    <result property="title" column="title" />
    <result property="author" column="authorId" select="selectAuthorById" />
    <select id="selectBookById" parameterClass="java.lang.Integer" resultMap="BookMap">
 select * from bs_book  where bookId=#bookId#
    </select>
    <select id="selectAuthorById" parameterClass="java.lang.Integer" resultClass="Author">
 select * from bs_author where authorId=#authorId#
    </select>  
</resultMap>注意下resultMap,它要求model的每个属性都得写一个 <result property="属性名(必须有get和set)" column="列名" />这是个问题,我简化了模型,实际上我的Book表有将近20个属性,那么写那么多resultMap,是不是很痛苦?
我应该选哪种model,我倾向于第二种,可是谁能给我解决resultMap必须写每个property的问题??
谢谢了
说明一下:不写某个列的property,则该列是查不出来的,我试过的。

解决方案 »

  1.   

    第一种方式:你直接把实体类属性和数据库表的字段设置一样,然后直接返回这个class,这样就可以不用写大量的resultMap
    第二种方式:如果你只想查找一个表的某些字段,你只需要返回一个map对象即可
      

  2.   

    对于ORM来说,还是应该使用第一种方式,因为authorId仅仅是一个字段而不能把它映射到类里面就给转成了类对象,这样不太符合ORM的映射的原则正常情况下,还是关系数据库里面的表结构直接映射成domain类,除了类型需要进行一些处理其他的不必转变映射关系
      

  3.   

    private Author author
    这里是不是可以建 一个关联自动关联到authorId就不用写那些东西了啊
      

  4.   

    问题不清楚,提供参考了 Spring与iBATIS的集成(转载)  http://www.phome.asia/forum/thread/15905.html Hibernate与IBatis的优缺点及可行性分析  http://www.phome.asia/forum/thread/17852.html
      

  5.   

    你可以创建一个视图,然后还是可以用resultClass来实现第二种方案
      

  6.   

    首先声明,我觉得2种方法都可以,
    properties多就多写己行吧。要不就写个生成工具,也不麻烦。我觉得还是看许需求来决定实现方法。
    如果“只要需要书籍的信息,就需要作者的信息”的话,
    就用第2种,这样也一劳永逸。免去了每次取得数据都还要再取一次作者的“麻烦”。如果“作者信息只是在需要的时候才取得”这样的需求,
    我的话还是选择第1种方法,
    这样起码节省了处理多余数据在网络上的“流量”,
    还能降低些些程序的复杂度。good luck
      

  7.   

    1 这个XML可以使用小工具生成。2 <result property="属性名(必须有get和set)" column="列名" />
    这个其实是非必须的,如果数据库字段与bean命名一致的话
      

  8.   

    ibatis也用过
    推荐torque
    效率也不差
      

  9.   

    那是肯定呀。没有对应的property,ibatis是不会去查找的。属性多久多呗,我那项目还不是一个resultMap对应二、三十个属性,一个一个列出来。
      

  10.   

    map可以不预先定义属性的,直接返回java.util.Map.HashMap就行。在service那里直接强转成map就行啦。
      

  11.   

    一般使用第一个方法的比较多。第二种也是直接返回的 map。
      

  12.   

    那就ResultMap吧,你必须指定Property的,iBATIS是一种SqlMap,他不是严格意义上的ORM框架,这就是他和Hibernate的区别,楼主可以去看看iBATIS的爸爸写的那本《iBATIS实战》,这里面对iBATIS的原理讲了好多
      

  13.   

    其实说实话 ,我都是用工具生成的,这个工具叫ibator,建议楼主去了解下。然后你说的这个问题我也遇到过,我的解决方式是:综合,将原来的数据库字段映射后,添加上他们之间的映射关系于MODEL内,也就是我保留了authorId,然后又添加上了Author author属性。当不需要2表联查的时候使用resultClass即可以,当需要的时候使用resultMap。我觉得你对IBATIS的映射机制还不够了解,特别是resultMap,建议你去学习下。
      

  14.   

    ibatis直接面向的是sql语句本身,它自己不参与维护表之间的关系,所以不要使用hibernate的级联思想来定义domain