读书人

Hibernate基本知识(1)

发布时间: 2013-11-23 10:52:51 作者: rapoo

Hibernate基本知识(一)
??????? ??? <key-property name="lastname" length="10"></key-property>
??????? </composite-id>
??????? 联合主键的类需要实现序列化接口!
???????
? 大对象存储
???? Clob:文本大对象,最大4G
???? Blob:二进制大对象,最大4G
???? ??????
?组合映射
???? 造成数据库大量冗余,不推荐
???? 如Address,“北京--海淀--xxx街”,多条记录如果地址相同,就冗余了
???? 可使用多对一关联来替代组合映射!
????

?
?---------------------》》》》》》》》》》》》》hibernate05_many2oneTwoWay
?1.多对一双向关联
???? 要点:
???? ??? 一的一方使用Set集合,集合使用泛型
???? ??? 关系的维护在多的一方维护
???? ??? 命名准确,写配置文件的时候一目了然
???? ??? 一般使用双向关联(从双方都可以获取到对方的数据)
??? many:
??? <hibernate-mapping package="org.hqh.hibernate.model">
??? ??? <class name="Employee" table="emp">
??? ??? ??? <id name="empid">
??? ??? ??? ??? <generator type="string"></property>
??? ??? ??? <property name="age" type="integer"></property>
??? ??? ??? <!--
??? ??? ??? ??? 定义外键
??? ??? ??? ??? name属性描述多方中类的外键属性 class描述被参考的那方
??? ??? ??? -->
??? ??? ??? <many-to-one name="department" cascade="save-update" lazy="false">
??? ??? ??? ??? <!-- 多方表中增加一个外键,给外键取别名【此处的column只是给外键起别名,不定义也可】 -->
??? ??? ??? ??? <column name="ref_deptid"></column>
??? ??? ??? </many-to-one>
??? ??? </class>
??? </hibernate-mapping>
???
??? one:
??? <hibernate-mapping package="org.hqh.hibernate.model">
??? ??? <class name="Department" table="dept">
??? ??? ??? <id name="deptid">
??? ??? ??? ??? <generator type="string"></property>
??? ??? ??? <!-- 一方的集合属性 -->
??? ??? ??? <!-- inverse=true 强制在多方维护关联,在一方进行操作不会对关联造成任何影响
??? ??? ??? ??? ?inverse=false 可以在一方维护关系,将发出多余的update语句来更新多方的外键,效率低
??? ??? ??? ??? ?laze=extra 延迟加载,并且hibernate将查询语句优化了,如判断集合的size时发出count(*)而不是查出所有的元素
??? ??? ??? -->
??? ??? ??? <set name="employees"? inverse="true" lazy="extra" cascade="save-update">
??? ??? ??? ??? <!--
??? ??? ??? ??? ??? key为多方定义的外键名
??? ??? ??? ??? ??? 指定多方定义的外键名,将通过此外键去关联对象【一方通过多方中的外键字段反向关联到多方】
??? ??? ??? ??? -->
??? ??? ??? ??? <key column="ref_deptid"></key>
??? ??? ??? ??? <!-- 指定多方的类名 -->
??? ??? ??? ??? <one-to-many />
??? ??? ??? </set>
??? ??? </class>
??? </hibernate-mapping>


2.cascade级联属性???
??? all:增删改都级联
??? save-update:保存employee时发现department未保存,则先保存department,再保存employee
??? delete:删除department的时候,先删除其下的所有employee,再删除自己(建议不用,防止数据误删)
??? all-delete-orphan:???
??? none(默认):不级联
???
3.inverse反向属性
??? 表示由哪方维护关联关系。
??? 默认为false,双方都可以维护。
??? 如果为true,则强制由多方维护关联关系。
??? 建议使用inverse=true,在多方维护关系
??? 【如果在一方维护关系,会发出多余的update语句来更新多方的外键字段】
???
???
?---------------------》》》》》》》》》》》》》hibernate06_one2oneTwoWay
?一对一关联
?1.唯一外键关联(建议使用)
???? 其中一方加一个字段,作为外键引用对方,增加了额外的外键字段
???? 增加字段的一方使用many-to-one定义 并使用unique=true
????
?2.主键关联
???? 双方id主键相同,没有额外的字段
???? 在哪方使用foreign策略呢?
???? ??? 注意:通过一方获取另一方,如果是查询使用了foreign的一方,先发一条查询语句查询出自己,如果要得到对方的数据
???? ??? 会再次发出一条关联查询语句。
???? ??? 如果查询没有使用foreign的一方,将只发出一条关联查询语句
?
?
?---------------------》》》》》》》》》》》》》hibernate07_many2manyTwoWay
?多对多关联
???? 1.如果使用many-to-many,存在以下缺点:
???? ??? 面对集合进行管理,需要复写hashcode(),equals()方法,否则判断集合中的是否contains某个对象将无法判断
???? ??? 由于第三张表中只存在2个字段记录关联,无法存储其它信息,如添加时间等,有局限性
???? 2.拆分多对多为2个多对一关联,将中间表设计为一个实体类,这样做的好处:
???? ??? 按照多对一进行关联关系的维护,简单,不容易出错,避免了对集合进行操作
???? ??? 可以在第三表对应的实体类中扩展其它信息,扩展性好
???? ? 其中,第三张表作为多的一方,与其它两个实体间构成2个多对一双向关联
????
?
?
---------------------》》》》》》》》》》》》》hibernate08_annotation
使用注解定义实体类之间的映射关系
??? 注:如果已经定义好数据库表,可以通过工具生成实体类和注解
??? hibernate推荐通过实体类来生成数据库表
1.如果集成了spring,则可通过annotation-scan扫描读取
2.未集成sping,则需要在hibernate.cfg.xml中注册实体类

???

读书人网 >开源软件

热点推荐