准备工作,新建两个实体类如下:

Husband.class:

 

  1. package com.himi; 
  2.  
  3. import javax.persistence.Entity; 
  4. import javax.persistence.GeneratedValue; 
  5. import javax.persistence.Id; 
  6. import javax.persistence.OneToOne; 
  7.  
  8. @Entity 
  9. public class Husband { 
  10.     @Id 
  11.     @GeneratedValue 
  12.     public int getId() { 
  13.         return id; 
  14.     } 
  15.     public void setId(int id) { 
  16.         this.id = id; 
  17.     } 
  18.     public String getName() { 
  19.         return name; 
  20.     } 
  21.     public void setName(String name) { 
  22.         this.name = name; 
  23.     } 
  24.     public Wife getWife() { 
  25.         return wife; 
  26.     } 
  27.     public void setWife(Wife wife) { 
  28.         this.wife = wife; 
  29.     } 
  30.     private int id; 
  31.     private String name; 
  32.     private Wife wife; 
  33.      

wife.class:

 

  1. package com.himi; 
  2.  
  3. import javax.persistence.Entity; 
  4. import javax.persistence.GeneratedValue; 
  5. import javax.persistence.Id; 
  6.  
  7. @Entity 
  8. public class Wife { 
  9.     @Id 
  10.     @GeneratedValue 
  11.     public int getId() { 
  12.         return id; 
  13.     } 
  14.     public void setId(int id) { 
  15.         this.id = id; 
  16.     } 
  17.     public String getName() { 
  18.         return name; 
  19.     } 
  20.     public void setName(String name) { 
  21.         this.name = name; 
  22.     } 
  23.     private int id; 
  24.     private String name; 
  25.      

生成数据库如下:

OK, 下面开始:

 1.  一对一:

          1.1 单向外键关联

使用注解   @OneToOne

当前Husband类中有一个wife对象,将其注解成OneToOne即可,那么观察生成的两张表如下:

mysql> desc Husband;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| name    | varchar(255) | YES  |     | NULL    |                |
| wife_id | int(11)      | YES  | MUL | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
3 rows in set (0.09 sec)

mysql> desc Wife;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

其中如果想更改注解 @OneToOne默认为我们生成的Wife_id名,可以使用@JoinColumn(name="xxx") 即可;

      1.2.  双向外键关联 :

仍然使用注解  @OneToOne

但是如果是双向关联,必须设置其@OneToOne(mappedBy="xxx")     xxx表示对方那里是主导属性名"

1.3  单向主键关联:

在@OneToOne 下继续使用注解:@PrimaryKeyJoinColumn  即可 ;

 1.4  双向主键关联

在另外一个关联类中,@OneToOne 下也继续使用注解:@PrimaryKeyJoinColumn

2.  一对一联合主键映射:

类似其他映射,只是联合主键在自定义名字时,不能使用 @JoinColumn,而是使用如下形式:

 

  1. @JoinColumns
  2.         { 
  3.             @JoinColumn(name="wifeId",referencedColumnName="id"), 
  4.             @JoinColumn(name="wifeName",referencedColumnName="name"
  5.         } 
  6.          
  7.     ) 

这里wifeId和wifeName是自定义主键名,referencedColumnName则对应其主键名;

 

3.(嵌入式对象)组件映射:

将另外一个类成为实体类的一部分进行映射;

注意:1.成为其他实体类一部门的类不要注解为@Entity 实体类!

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

3.组件属性名名为了保证不与实体类属性名冲突,可以使用如下注解:

3.1 使用如下形式:

 

  1. @AttributeOverrides
  2.         { 
  3.             @AttributeOverride(name="xx",column=@Column(name="xxx")), 
  4.             @AttributeOverride(name="xx2",column=@Column(name="xxx2")), 
  5.              
  6.         } 
  7.     ) 

3.2 在嵌入式对象里,对其属性使用@column进行设置;

 

4.多对一单向关联

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

5.   一对多单向关联

如果直接使用  @OneToMany 进行注解,默认Hibernate当成多对多进行映射,如果需要设置一对多,那么如下继续注解:

@JoinColumn(name="GroupId")   加入这个即可让默认多对多,当成一对多处理;

 

6.一对多、多对一双向关联

一对多,多对一双向关联属于一个映射;直接使用mappedBy即可(  @OneToMany(mappedBy="xxx")  );

 

7. 多对多单向关联

使用注解    @ManyToMany ,其中如果想自定义中间表的表名和类名可以使用 @JoinTable 关键字;

 

8.多对多双向关联

关联两个实体类 @ManyToMany即可;