1. 程式人生 > >4.一對多關聯映射

4.一對多關聯映射

記錄 個學生 缺省 key turn 順序 hbm.xml -m 映射

1.實體一對多關聯

一對多聯系(1:n)
定義:
如果對於實體集A中的每一個實體,實體集B中有n個實體(n≥0)與之聯系,反之,對於實體集B中的每一個實體,實體集A中至多只有一個實體與之聯系,則稱實體集A與實體集B有一對多聯系,記為1:n。
實例:
一個班級中有若幹名學生,每個學生只在一個班級中學習。

2.數據庫一對多關聯

在關系模型中,只存在外鍵參照關系,而且是 many 方參照 one 方。

3.Hibernate單向一對多關聯

在關系模型中,只存在外鍵參照關系,而且是 many 方參照 one 方。
public class User {
    private Integer id;
    private String userName;
    private String password;
    private Set orderSet = new HashSet
<Order>(); ...... } public class Order { private Integer id; private Double price; // 價格 ...... }
映射配置文件
在 User.hbm.xml 文件中使用 <set>元素配置。

<set name="orderSet" cascade="delete">
    <key column="USERID"/>
    <one-to-many class="Order" />
</set>
<
set>元素屬性: name屬性:指定要映射的屬性名; cascade級聯操作屬性:save-update、delete、all、none。
<set>元素的子元素:
<key>元素:column 屬性設定所關聯類對應表的外鍵;
<one-to-many>元素:class 屬性設定所關聯的類。
在表示一對多關聯關系時,還可以使用 List 和 Map 來表示引用集合。
public class User {
    private Integer id;
    private String userName;
    private String password;
    private List orderList = new ArrayList
<Order>(); …… }

使用 List 映射時,需要在 Order 表中添加一個額外字段 (ORDERINDEX) 來表示插入順序。

在User.hbm.xml文件中使用 <list>元素配置。

<list name="orderList" cascade="delete">
<key column="USERID"/>
<index column="ORDERINDEX"/>
<one-to-many class="Order" />
</list>

<index>子元素:
column 屬性:指定 ORDER 表中記錄插入順序的列名。

使用 Map 映射時,需要在 Order 表中添加一個額外字段 (ORDERKEY) 來記錄 Map 的 key 值。
<map name="orderMap" cascade="delete">
    <key column="USERID"/>
    <index column="ORDERKEY" type="string"/>
    <one-to-many class="Order" />
</map>

<index>子元素:
column 屬性:指定記錄 Map 中 key 值得字段名。
type 屬性:指定 Map 中 key 值的類型(不可缺省)。

 

4.Hibernate 雙向一對多關聯

建立 User 和 Order 的雙向一對多關聯。
在 User 到 Order 單向一對多關聯關系基礎上,在 Order 類中增加 User 類型的屬性。

public class Order {
    private Integer id; 
    private Double price; // 價格
    private User user;
    ......
}
Order.hbm.xml 中添加 user 屬性的映射。
<many-to-one name="user" column="USERID" class="User"/> 
<many-to-one>元素的屬性:
name 屬性:指定需映射的屬性名;
column 屬性:指定ORDER中的外鍵列名;
class 屬性:指定所關聯的類型。

使用註解映射一對多關聯:

在 many 方 Order類 的 getUser() 方法上配置。
@ManyToOne
@JoinColumn(name="USERID")
public User getUser() {
    return user;
}

@JoinColumn(name = "USERID") : 指定 ORDER 表中的外鍵列名。
在 one 方 User類 的 getOrderSet() 方法上配置。
@OneToMany(mappedBy="user", targetEntity=Order.class, 
        cascade=CascadeType.ALL)
public Set getOrderSet() {
    return orderSet;
}

mappedBy:表明是雙向關聯關系,並且與 user 建立對應。
targetEntity:指定了所關聯的類型。
cascade:指定級聯操作。

4.一對多關聯映射