`
yijingyong
  • 浏览: 156382 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hibernate映射解析!

阅读更多
                    Hibernate映射解析!
<hibernate-mapping package="com.allanlxf.hbn.o2m">
     <class name="Order" table="order_o2m">
         <id name="id" column="id" type="integer">
             <generator class="sequence">
                 <param name="sequence">order_o2m_seq</param>
             </generator>
         </id>
         <property name="no" column="no" type="string"/>
         <property name="owner" column="owner" type="string"/>
         <property name="sendDate" column="sdate" type="date"/>
         <set name="items" cascade="all-delete-orphan" inverse="true">
             <key column="orderid" />
             <one-to-many class="Item"/>
         </set>
     </class>
</hibernate-mapping>
*****************************************************************************************
<一>映射类所在的包;
<hibernate-mapping package="com.allanlxf.hbn.o2m">
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<二>将类和数据库的表联系起来;
<class name="Order" table="order_o2m">
class name="Order" (实体类的类名)
table="order_o2m" (实体类所对应的表名)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<三>主键生成策略;
<id name="id" column="id" type="integer">
name="id" (实体类里的属性名)
column="id" (实体类所对应表中的字段名)
type="integer" (字段名id所属的类型<类中的"int"类型在表中等于"integer"类型>)
______________________________________________________________________________________________
<generator class="sequence">
class="sequence"> (指定主键id生成策略为sequence算法)
______________________________________________________________________________________________
<param name="sequence">order_o2m_seq</param>
name="sequence">order_o2m_seq< (指sequence算法所对应的是库中所创建的order_o2m_seq名)
</generator>
</id> (注:这样的算法是需要在库中创建的,创建方法:create sequence order_o2m_seq)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
<四>类中的属性和字段之间建立联系;
<property name="no" column="no" type="string"/>
name="no" (类中的属性名)
column="no"   (表中的字段名)
type="string" (指定字段名的类型) 注:类型可以省略,因为Hibernate可以自动识别,Data类型必须指名
_______________________________________________________________________________________________
<property name="owner" column="owner" type="string"/>   (同上)
<property name="sendDate" column="sdate" type="date"/>   (同上)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<五>指定一对多关联的对象属性;
<set name="items" cascade="all-delete-orphan" inverse="true">
set name="items" (自身实体类的属性名"items") 注:Order类中的属性Set<Item> items = new HashSet<Item>();此属性起关联作用
cascade="all-delete-orphan" ("cascade"级联的标签,删除主对象)
inverse="true" (inverse="true",维护权在Item手中,于是Hibernate不再发送update语句,而由Item自动取得orderid.)
________________________________________________________________________________________________
<key column="orderid" />
key column="orderid" ("key column"中key标签总是和本身类(Order)主键值相对应)
________________________________________________________________________________________________
<one-to-many class="Item"/>
class="Item" (一对多所关联对象的类名)
_______________________________________________________________________________________________
</set>
</class>
</hibernate-mapping>
*******************************************************************************************
总结:主要针对第五步骤:
现对每个属性具体描述一下:
set name="items"中的"items"其实是一个集合的对象,它是将Item中的条目放到集合中,这里为什么用HashSet方法,而不用list 方法呢?区别是HashSet方法是一种无序排列,排除可重性;而list是有序排列,不排除可重性.
cascade用法,我用了表来表示
================================================================================================================
cascade属性值   ||   意义
----------------------------------------------------------------------------------------------------------------
none    || 在保存,删除或修改对象时,不考虑对其附属物(关联对象)的操作,这是默认设置
----------------------------------------------------------------------------------------------------------------
         save-update   || 在保存,更新当前对象时,级联保存,更新附属物(临时对象,游离对象)
----------------------------------------------------------------------------------------------------------------
delete    || 在删除当前对象时,级联删除附属物
----------------------------------------------------------------------------------------------------------------
all    || 包含save-update和delete的操作
----------------------------------------------------------------------------------------------------------------
delete-orphan   || 删除和当前对象解除关系的附属对象
================================================================================================================
inverse="true",如果这个属性设置不是true,那么在实现添加过程中都是一条insert语句加上一条update语句,如果为 true,那么就是由对方去维护,就是说在添加的过程中只用一条insert语句就可以.(inverse="true"一般加在set端,哪边有FK, 就由哪边负责).
key column="orderid",就是在取得Order对象时,通过order_o2m表中的主键id与item_m2o表中的外键orderid进行匹配.
******************************************************************************************
create table order_o2m
(
     id number(4) not null,
     no varchar2(13),
     owner varchar2(20),
     sdate date,
     primary key(id)
)

create sequence order_o2m_seq;

/**多对一**/
<hibernate-mapping package="com.allanlxf.hbn.o2m">
       <class name="Item" table="item_m2o"> 
         <id name="id" column="id" type="integer">  
             <generator class="sequence">   
                 <param name="sequence">item_m2o_seq</param> 
             </generator> 
         </id>      
         <property name="product" column="product" type="string"/>
         <property name="price" column="price" type="double"/>
         <property name="amount" column="amount" type="integer"/>
         <many-to-one name="order" class="Order" column="orderid"/>
     </class>
</hibernate-mapping>
*************************************************************************************
<一>映射类所在的包;
<hibernate-mapping package="com.allanlxf.hbn.o2m">
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<二>将类和数据库的表联系起来;
<class name="Item" table="item_m2o">
class name="Item" (实体类的类名)
table="item_m2o" (实体类所对应的表名)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<三>主键生成策略;
<id name="id" column="id" type="integer">
name="id" (实体类里的属性名)
column="id" (实体类所对应表中的字段名)
type="integer" (字段名id所属的类型<类中的"int"类型在表中等于"integer"类型>)
______________________________________________________________________________________________
<generator class="sequence">
class="sequence"> (指定主键id生成策略为sequence算法)
______________________________________________________________________________________________
<param name="sequence">item_m2o_seq</param>
name="sequence">item_m2o_seq< (指sequence算法所对应的是库中所创建的item_m2o_seq名)
</generator>
</id> (注:这样的算法是需要在库中创建的,创建方法:create sequence item_m2o_seq;)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<四>类中的属性和字段之间建立联系;
<property name="product" column="product" type="string"/>
name="product" (类中的属性名)
column="product"   (表中的字段名)
type="string" (指定字段名的类型) 注:类型可以省略,因为Hibernate可以自动识别,Data类型必须指名
_______________________________________________________________________________________________
<property name="price" column="price" type="double"/>   (同上)
<property name="amount" column="amount" type="integer"/> (同上)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<五>指定多对一关联的对象属性;
<many-to-one name="order" class="Order" column="orderid"/>
name="order" (自身实体类中的属性名) 注:Item类中的属性private Order order此属性起关联作用
class="Order" (所关联对象(实体类)的类名)
column="orderid" (orderid是Item表中的字段名(列名),同时也是外键,起关联作用) (注:此外键的创建方法:alter table item_m2o add constraint fk_item_order_m2o foreign key(orderid) references order_o2m(id) )
________________________________________________________________________________________________
</class>
</hibernate-mapping>       
*****************************************************************************************
总结:此总结针对步骤三以及步骤五:
步骤三:主要是对ID的生成算法作一些描述.ID的生成算法常用的有以下几种:
"sequence(采用数据库提供的Sequence机制生成主键,适用于支持Oracle数据库);
"identity"(采用数据库提供的主键生成机制,DB2/SQLServer/MySQL);
"increment"(主键按数值逐渐递增.如果在同一个数据库中有多个实例访问,就避免使用,个人认为适合单线程);
"native"(由Hibrenate根据底层数据库自行判断采用identity,hilo和sequence中的一种作为主键生成方式);
"foreign"(使用外部表的字段作为主键);
"uuid.hex"是基于Hibernate128位惟一值产生算法生成十六进制数值.
步骤五:主要阐述一下原理,在Item类中包含了"order"属性(order属性是让Item类与Order类产生关联),然后在item_m2o表中通过orderid(外键)于order_o2m发生关联(item_m2o表的外键是引用了order_o2m主键),order_o2m的实体类是 Order
******************************************************************************************
结合表结构对比分析:
create table item_m2o
(
     id number(4) not null,
     product varchar2(30),
     amount number(5),
     price number(6,1),
     orderid number(4),
     primary key(id)
)

create sequence item_m2o_seq;

alter table item_m2o add constraint fk_item_order_m2o
     foreign key(orderid)
         references order_o2m(id)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics