天天看点

【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,如需转载请自行联系原作者