下面使用的“pojo”指mapping文件中与数据库表对应的类,或类的对象。
[code:1]以 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同理。 转载:http://www.javaeye.com/topic/17351