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

下面使用的“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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值