Hibernate框架(二)

组件

没有 OID, 不能被单独持久化, 生命周期依赖于所属的持久化类的对象的生命周期。

<!-- 映射组成关系 -->

<component name="pay" class="Pay">

    <parent name="worker"/>

    <!-- 指定组成关系的组件的属性 -->

    <property name="monthlyPay" column="MONTHLY_PAY"></property>

    <property name="yearPay" column="YEAR_PAY"></property>

    <property name="vocationWithPay" column="VOCATION_WITH_PAY"></property>

</component>

一对多关联关系

n-1:

<!-- 映射多对一的关联关系。 使用 many-to-one 来映射多对一的关联关系

name: 多这一端关联的一那一端的属性的名字

class: 一那一端的属性对应的类名

column: 一那一端在多的一端对应的数据表中的外键的名字

-->

<many-to-one name="customer" class="Customer" column="CUSTOMER_ID"></many-to-one>

name: 设定待映射的持久化类的属性的名字

column: 设定和持久化类的属性对应的表的外键

class:设定待映射的持久化类的属性的类型

 

 

1-n:

<!-- 映射 1 对多的那个集合属性 -->

<!-- set: 映射 set 类型的属性, table: set 中的元素对应的记录放在哪一个数据表中. 该值需要和多对一的多的那个表的名字一致 -->

<!-- inverse: 指定由哪一方来维护关联关系. 通常设置为 true, 以指定由多的一端来维护关联关系 -->

<!-- cascade 设定级联操作. 开发时不建议设定该属性. 建议使用手工的方式来处理 -->

<!-- order-by 在查询时对集合中的元素进行排序, order-by 中使用的是表的字段名, 而不是持久化类的属性名  -->

<set name="orders" table="ORDERS" inverse="true" order-by="ORDER_NAME DESC">

       <!-- 执行多的表中的外键列的名字 -->

       <key column="CUSTOMER_ID"></key>

       <!-- 指定映射类型 -->

       <one-to-many class="Order"/>

</set>

name: 设定待映射的持久化类的属性的

column: 指定关联表的外键名

<one-to-many> 元素设定集合属性中所关联的持久化类

class: 指定关联的持久化类的类名

 

inverse = false 的为主动方,inverse = true 的为被动方, 由主动方负责维护关联关系

Cascade:

order-by:排序

一对一关联关系

方法一(主键):

<!--采用 foreign 主键生成器策略的一端增加 one-to-one 元素映射关联属性, 其 one-to-one 节点还应增加 constrained=true 属性, 以使当前的主键上添加外键约束-->

<one-to-one name="mgr" class="Manager" constrained="true"></one-to-one>
<one-to-one name="dept"     class="com.atguigu.hibernate.one2one.primary.Department"></one-to-one>

constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象(“对方”)所对应的数据库表主键

 

 

方法二(外键):

<!-- 使用 many-to-one 的方式来映射 1-1 关联关系 -->

<many-to-one name="mgr" class="com.atguigu.hibernate.one2one.foreign.Manager" 

column="MGR_ID" unique="true"></many-to-one>
<!-- 映射 1-1 的关联关系: 在对应的数据表中已经有外键了, 当前持久化类使用 one-to-one 进行映射 -->

<!--没有外键的一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段-->

<one-to-one name="dept"          class="com.atguigu.hibernate.one2one.foreign.Department"

         property-ref="mgr"></one-to-one>

多对多关联关系

对于双向 n-n 关联, 必须把其中一端的 inverse 设置为 true, 否则两端都维护关联关系可能会造成主键冲突.

<!-- table: 指定中间表 -->

<set name="items" table="CATEGORIES_ITEMS">

     <key>

         <column name="C_ID" />

     </key>

     <!-- 使用 many-to-many 指定多对多的关联关系. column 执行 Set 集合中的持久化类在中间表的外键列的名称  -->

     <many-to-many class="Item" column="I_ID"></many-to-many>

</set>
<set name="categories" table="CATEGORIES_ITEMS" inverse="true">

     <key column="I_ID"></key>

     <many-to-many class="com.atguigu.hibernate.n2n.Category" column="C_ID"></many-to-many>

</set>

继承关系

 

Subclass

父类和子类使用同一张表

Discriminator辨别者列,用来区分分父类和子类

<class name="Person" table="PERSONS" discriminator-value="PERSON">

        <id name="id" type="java.lang.Integer">

            <column name="ID" />

            <generator class="native" />

        </id> 

        <!-- 配置辨别者列 -->

<discriminator column="TYPE" type="string"></discriminator>

        <property name="name" type="java.lang.String">

            <column name="NAME" />

        </property>

        <property name="age" type="int">

            <column name="AGE" />

        </property>

        <!-- 映射子类 Student, 使用 subclass 进行映射 -->

        <subclass name="Student" discriminator-value="STUDENT">

         <property name="school" type="string" column="SCHOOL"></property>

        </subclass>

</class>
public void testSave(){

Person person = new Person();

person.setAge(11);

person.setName("AA");

session.save(person);



Student stu = new Student();

stu.setAge(22);

stu.setName("BB");

stu.setSchool("ATGUIGU");

session.save(stu);

}

 joined-subclass

每个子类一张表,子类实例由父类表和子类表共同存储,每个子类使用 key 元素映射共有主键。

<class name="Person" table="PERSONS">

        <id name="id" type="java.lang.Integer">

            <column name="ID" />

            <generator class="native" />

        </id>

        

        <property name="name" type="java.lang.String">

            <column name="NAME" />

        </property>

        

        <property name="age" type="int">

            <column name="AGE" />

        </property>

        

        <joined-subclass name="Student" table="STUDENTS">

         <key column="STUDENT_id"></key>

         <property name="school" type="string" column="SCHOOL"></property>

        </joined-subclass>

        

</class>

persons 表:

students 表:

union-subclass

将每一个实体对象映射到一个独立的表中。

<class name="Person" table="PERSONS">



        <id name="id" type="java.lang.Integer">

            <column name="ID" />

            <generator class="hilo" />

        </id>

        

        <property name="name" type="java.lang.String">

            <column name="NAME" />

        </property>

        

        <property name="age" type="int">

            <column name="AGE" />

        </property>



<union-subclass name="Student" table="STUDENTS">

<property name="school" column="SCHOOL" type="string"></property>

</union-subclass>        

        

</class>
public void testSave(){

Person person = new Person();

person.setAge(11);

person.setName("AA");



session.save(person);



Student stu = new Student();

stu.setAge(22);

stu.setName("BB");

stu.setSchool("ATGUIGU");

session.save(stu);

}

 

Person表:

Student表:

union-subclass

将每一个实体对象映射到一个独立的表中。

persons 表:

students 表:

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流光影下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值