10. 集合映射-bag

集合映射-bag

Bag,实际上就是List的另一个版本,我们使用List存储元素时,元素以先后添加顺序存储在集合中,映射到数据库中时,也会保持先后顺序,当我们从数据库中取出数据时,数据依然有序,如果我们并不想维持元素之间的先后顺序关系,那我们可以使用没有顺序的List——Bag。

Bag

表结构

items_bag表(父表)

CREATE TABLE items_bag(
    id NUMBER(10) PRIMARY KEY,
    name VARCHAR2(20)
);

images_bag表(子表)

CREATE TABLE images_bag(
    id NUMBER(10) PRIMARY KEY,
    filename VARCHAR2(20) NOT NULL,
    items_id NUMBER(10) NOT NULL REFERENCES items_bag(id)
);

回顾之前的set和list集合映射,我们在映射实体类时,我们都是在映射文件中去指明子表的主键,而在映射值类型时,我们都是都未在set或者list标签中映射主键,而是直接在表结构中使用使用表中的栏位作为联合主键。

现在我们在Bag集合映射中,有两种配置方式,一种是bag,另一种是idbag,看到这里我们容易看出区别,idbag可以配置主键,bag不可配置主键。回到我们上面的表结构,images_bag表中有主键,且我们使用List集合来存储image时使用的是值类型(String),所以我们应该使用idbag来配置。

类结构

public class ItemsBag{
    private Integer id;
    private String name;
    private List<String> images=new ArrayList<String>();
    ......
}

映射文件

idbag标签:用来配置子表,这里对应的类型为值类型

collection-id:用来配置子表的主键以及主键的生成策略

key:子表的外键栏位,还可配置外键的类型

element:配置子表的其他栏位

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.li.list.pojo">
    <class name="ItemsBag" table="ITEMS_BAG">
        <id name="id" type="integer" column="ID">
            <generator class="assigned"></generator>
        </id>
        <property name="name" column="NAME" type="string"/>
        <idbag name="images" table="IMAGES_BAG">
            <collection-id type="integer" column="ID">
                <generator class="assigned"/>
            </collection-id>
            <key column="ITEMS_ID"/>
            <element column="FILENAME" type="string" not-null="true"?/>
        </idbag>
    </class>

</hibernate-mapping>

bag配置实体类映射文件

映射为实体类(在数据库中有表),映射关系为一对多。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.li.association.one2many.pojo">
    <class name="Order" table="T_ORDER">
        <id name="id" type="long" column="ID"></id>
        <property name="orderedDate" type="date" column="ORDERED_DATE"></property>
        <property name="shippedDate" type="date" column="SHIPPED_DATE"></property>
        <property name="total" type="double" column="TOTAL"></property>

        <bag name="orderLines" cascade="all" inverse="false">
            <key column="ORDER_ID"/>
            <one-to-many class="OrderLine"/>
        </bag>
    </class>
</hibernate-mapping>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值