天天看點

【Hibernate架構開發之六】Annotation關系映射&元件映射!

 準備工作,建立兩個實體類如下:

Husband.class:

package com.himi; 

import javax.persistence.Entity; 

import javax.persistence.GeneratedValue; 

import javax.persistence.Id; 

import javax.persistence.OneToOne; 

@Entity 

public class Husband { 

    @Id 

    @GeneratedValue 

    public int getId() { 

        return id; 

    } 

    public void setId(int id) { 

        this.id = id; 

    public String getName() { 

        return name; 

    public void setName(String name) { 

        this.name = name; 

    public Wife getWife() { 

        return wife; 

    public void setWife(Wife wife) { 

        this.wife = wife; 

    private int id; 

    private String name; 

    private Wife wife; 

wife.class:

public class Wife { 

生成資料庫如下:

OK, 下面開始:

 1.  一對一:

          1.1 單向外鍵關聯

使用注解   @OneToOne

目前Husband類中有一個wife對象,将其注解成OneToOne即可,那麼觀察生成的兩張表如下:

<a href="http://blog.51cto.com/xiaominghimi/969784#">?</a>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<code>mysql&gt; </code><code>desc</code> <code>Husband;</code>

<code>+</code><code>---------+--------------+------+-----+---------+----------------+</code>

<code>| Field   | Type         | </code><code>Null</code> <code>| </code><code>Key</code> <code>| </code><code>Default</code> <code>| Extra          |</code>

<code>| id      | </code><code>int</code><code>(11)      | </code><code>NO</code>   <code>| PRI | </code><code>NULL</code>    <code>| auto_increment |</code>

<code>| </code><code>name</code>    <code>| </code><code>varchar</code><code>(255) | YES  |     | </code><code>NULL</code>    <code>|                |</code>

<code>| wife_id | </code><code>int</code><code>(11)      | YES  | MUL | </code><code>NULL</code>    <code>|                |</code>

<code>3 </code><code>rows</code> <code>in</code> <code>set</code> <code>(0.09 sec)</code>

<code>mysql&gt; </code><code>desc</code> <code>Wife;</code>

<code>+</code><code>-------+--------------+------+-----+---------+----------------+</code>

<code>| Field | Type         | </code><code>Null</code> <code>| </code><code>Key</code> <code>| </code><code>Default</code> <code>| Extra          |</code>

<code>| id    | </code><code>int</code><code>(11)      | </code><code>NO</code>   <code>| PRI | </code><code>NULL</code>    <code>| auto_increment |</code>

<code>| </code><code>name</code>  <code>| </code><code>varchar</code><code>(255) | YES  |     | </code><code>NULL</code>    <code>|                |</code>

<code>2 </code><code>rows</code> <code>in</code> <code>set</code> <code>(0.00 sec)</code>

其中如果想更改注解 @OneToOne預設為我們生成的Wife_id名,可以使用@JoinColumn(name="xxx") 即可;

      1.2.  雙向外鍵關聯 :

仍然使用注解  @OneToOne

但是如果是雙向關聯,必須設定其@OneToOne(mappedBy="xxx")     xxx表示對方那裡是主導屬性名"

1.3  單向主鍵關聯:

在@OneToOne 下繼續使用注解:@PrimaryKeyJoinColumn  即可 ;

 1.4  雙向主鍵關聯

在另外一個關聯類中,@OneToOne 下也繼續使用注解:@PrimaryKeyJoinColumn

2.  一對一聯合主鍵映射:

類似其他映射,隻是聯合主鍵在自定義名字時,不能使用 @JoinColumn,而是使用如下形式:

@JoinColumns( 

        { 

            @JoinColumn(name="wifeId",referencedColumnName="id"), 

            @JoinColumn(name="wifeName",referencedColumnName="name") 

        } 

    ) 

這裡wifeId和wifeName是自定義主鍵名,referencedColumnName則對應其主鍵名;

3.(嵌入式對象)元件映射:

将另外一個類成為實體類的一部分進行映射;

注意:1.成為其他實體類一部門的類不要注解為@Entity 實體類!

2. 使用@Embedded 将其類注解即可;

3.元件屬性名名為了保證不與實體類屬性名沖突,可以使用如下注解:

3.1 使用如下形式:

@AttributeOverrides( 

            @AttributeOverride(name="xx",column=@Column(name="xxx")), 

            @AttributeOverride(name="xx2",column=@Column(name="xxx2")), 

3.2 在嵌入式對象裡,對其屬性使用@column進行設定;

4.多對一單向關聯

很容易,直接使用注解  @ManyToOne

5.   一對多單向關聯

如果直接使用  @OneToMany 進行注解,預設Hibernate當成多對多進行映射,如果需要設定一對多,那麼如下繼續注解:

@JoinColumn(name="GroupId")   加入這個即可讓預設多對多,當成一對多處理;

6.一對多、多對一雙向關聯

一對多,多對一雙向關聯屬于一個映射;直接使用mappedBy即可(  @OneToMany(mappedBy="xxx")  );

7. 多對多單向關聯

使用注解    @ManyToMany ,其中如果想自定義中間表的表名和類名可以使用 @JoinTable 關鍵字;

8.多對多雙向關聯

關聯兩個實體類 @ManyToMany即可;

本文轉自 xiaominghimi 51CTO部落格,原文連結:http://blog.51cto.com/xiaominghimi/969784,如需轉載請自行聯系原作者