论坛首页 Java企业应用论坛

hibernate mapping文件中的标记详解:映射标记

浏览 9110 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-12-03  
下面使用的“pojo”指mapping文件中与数据库表对应的类,或类的对象。

以 Teacher(老师); / Subject(科目)为例

1.常见的标记都是用来把字段映射到pojo对象的属性.这类标记暂叫“映射标记”.

1.1 映射标记的column属性即表示与哪个字段映射。多个column可用column子标记。

1.2 字段映射到属性时,有下面两种情况:
    (1);一个字段对应一个属性,属性可为简单类型,也可为自定义class(MyClass)
    (2);多个字段对应一个属性,属性为自定义class(MyClass)
    
    对于(1):典型的标记为id ,property
    
        eg. <id name="cardId" column="CARD_ID" type="long"><!--teacher的key-->
            <property name="name" column="Name" type="string"/><!--teacher的名字属性-->
        这两个标记就可以搞定一张简单的表。
        
        extend: 用自定义的类Card来作属性的类型,为
            <id name="card" column="CARD_ID" type="db.CARD">
            
            自定义类Card须实现一个接口:UserType或者CompositeUserType
            public class Card implements UserType{}
            
    对于(2):典型的标记为composite-id + key-property | key-many-to-one ,
    
        eg. <!--subject的key-->
            <composite-id name="pk" class="db.SubjectPK">
                <key-property name="teacherId" column="TEACHER_ID" type="long"/>
                <key-property name="subjectId" column="SUBJECT_ID" type="long"/>
            </composite-id>
            
        key-many-to-one与many-to-one很像,见many-to-one
        
    对于(2):非 典型的标记有:component+property,many-to-one,key-many-to-one		
        component将部分property集中到一个class中
        
        eg: <!-subject的book属性-->
        <component name="book" class="Book">
            <property name="mainBook" column="MAIN_BOOK" type="string"/>
            <property name="subBook" column="SUB_BOOK" type="string"/>
        </component>
        
        component和CompositeUserType的区别是:
            component是一个普通的bean,可简单地 看 作 是把部分属性集合成一个class
            CompositeUserType则是hibernate认可地,基本类型可用的地方,它就可用,比如type="MyCompositeUserType"。
    
    
    当属性的类型为另一个数据库表的pojo时,映射关系就由“字段--属性对应”变为“表--表对应”
        
         <!-subject的teacher属性-->
        <many-to-one name="teacher" class="db.Teacher" update="false" insert="false">
            <column name="TEACHER_ID"/>
        </many-to-one>
        
        1.如果将many-to-one移到composite-id中,那么就用key-many-to-one
            <composite-id name="pk" class="db.SubjectPK">
                <key-many-to-one name="teacher" class="db.Teacher" column="SUBJECT_ID"/>
                <key-property name="subjectId" column="SUBJECT_ID" type="long"/>
            </composite-id>
        
        2.如果用自定义的类型代替pojo Teacher,那么就成为:
            <property name="teacher" class="db.TeacherUserType" update="false" insert="false">
                <column name="TEACHER_ID"/>
            </property>
            此时就是一个简单的“字段--属性对应”
            
    extend:one-to-one与many-to-one不同,它不能将字段映射为属性,因为one-to-one的关系是表的key与其他表的字段的关系,
        而key是由id,composite-id等标记来映射到属性的。one-to-one属于“关系标记”。
            
1.3 在利用pojo对象进行数据库操作时,pojo的每个属性会精确地还原为一个字段。
    一个pojo对象的属性的属性也可以 看 作 是pojo的属性。
    例外:如果一个标记的update="false",那么在 做 数据库的update操作时,不会考虑该标记所属的属性,即这些属性
         对应的字段不会因为这些属性的值 改 变 而 改   变 。
         标记的insert="false"有同功。	
        
         有update和insert属性的“映射标记”:property  many-to-one component  dynamic-component
           

1.4 映射标记 要 遵 循 的准则:
    (1)一个字段不可与多个(>1)属性对应。
    (2)如果一个字段与多个属性对应,则要保证其中只有一个属性的update="true", insert="true"。
        
     这条限制是基于一个事实:在sql中update语句不能set一个字段两次,不然会报“duplicate column name”错;
                          insert同理。
     
   发表时间:2005-12-03  
看到帖子加精,高兴。

看hibernate一个月了,用它也有半年了,整理下思路。

昨天注的册,“注册后三十天才可发帖”的规矩我第一次看到,本论坛有,其它没看到过。没办法,死皮赖脸去找robbin,让加权限,没想robbin这么快就给我办了,佩服的五体投地。

总共写了4篇,还有几篇没动笔。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics