您的位置:首页 > 其它

Hibernate关联映射(注解版)

2015-12-17 10:51 399 查看
属性介绍:

1.多对一:

1.  <span style="font-size:16px;">@ManyToOne(fetch=FetchType,cascade=CascadeType)</span>  

@ManyToOne表示一个多对一的映射,该注解标注的属性通常是数据库表的外键 

optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true 

fetch:表示抓取策略,默认为FetchType.EAGER 

cascade:表示默认的级联操作策略,可以指定为ALL,PERSIST,MERGE,REFRESH和REMOVE中的若干组合,默认为无级联操作 

targetEntity:表示该属性关联的实体类型.该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity. 

示例:

1.  <span style="font-size:16px;">//订单Order和用户User是一个ManyToOne的关系   

2.      //在Order类中定义   
3.      @ManyToOne()   

4.      @JoinColumn(name="USER")   
5.      public User getUser() {   

6.         return user;   
7.      }   

8.  </span>  

2.

1.  <span style="font-size:16px;">@JoinColumn</span>  

@JoinColumn和@Column类似,介量描述的不是一个简单字段,而一一个关联字段,例如.描述一个@ManyToOne的字段. 

name:该字段的名称.由于@JoinColumn描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定. 

例如,实体Order有一个user属性来关联实体User,则Order的user属性为一个外键, 

其默认的名称为实体User的名称+下划线+实体User的主键名称 

示例:见@ManyToOne

3.一对多:

1.  <span style="font-size:16px;">@OneToMany(fetch=FetchType,cascade=CascadeType)   

2.  </span>  

@OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段. 

fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存 

cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新删除 

例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除 

示例: 

@OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段. 

fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存 

cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新删除 

例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除 

示例: 

1.  <span style="font-size:16px;">@OneTyMany(cascade=ALL)   

2.      public List getOrders() {   
3.         return orders;   

4.      }   
5.  </span>  

 

4.

1.  <span style="font-size:16px;">@OneToOne(fetch=FetchType,cascade=CascadeType)</span>  

@OneToOne描述一个一对一的关联 

fetch:表示抓取策略,默认为FetchType.LAZY 

cascade:表示级联操作策略 

示例: 

@OneToOne描述一个一对一的关联 

fetch:表示抓取策略,默认为FetchType.LAZY 

cascade:表示级联操作策略 

示例: 

1.  <span style="font-size:16px;">@OneToOne(fetch=FetchType.LAZY)   

2.      public Blog getBlog() {   
3.         return blog;   

4.      }   
5.  </span>  

 

5.

1.  <span style="font-size:16px;">@ManyToMany   

2.  </span>  

@ManyToMany 描述一个多对多的关联.多对多关联上是两个一对多关联,但是在ManyToMany描述中,中间表是由ORM框架自动处理 

targetEntity:表示多对多关联的另一个实体类的全名,例如:package.Book.class 

mappedBy:表示多对多关联的另一个实体类的对应集合属性名称 

示例: 

User实体表示用户,Book实体表示书籍,为了描述用户收藏的书籍,可以在User和Book之间建立ManyToMany关联@ManyToMany描述一个多对多的关联.多对多关联上是两个一对多关联,但是在ManyToMany描述中,中间表是由ORM框架自动处理

targetEntity:表示多对多关联的另一个实体类的全名,例如:package.Book.class 

mappedBy:表示多对多关联的另一个实体类的对应集合属性名称 

示例: 

User实体表示用户,Book实体表示书籍,为了描述用户收藏的书籍,可以在User和Book之间建立ManyToMany关联

1.  <span style="font-size:16px;">@Entity   

2.      public class User {   
3.         private List books;   

4.         @ManyToMany(targetEntity=package.Book.class)   
5.         public List getBooks() {   

6.             return books;   
7.         }   

8.         public void setBooks(List books) {   
9.             this.books=books;   

10.       }   
11.    }     

12.  
13.    @Entity   

14.    public class Book {   
15.       private List users;   

16.       @ManyToMany(targetEntity=package.Users.class, mappedBy="books")   
17.       public List getUsers() {   

18.           return users;   
19.       }   

20.  
21.       public void setUsers(List users) {   

22.           this.users=users;   
23.       }   

24.    }   
25.</span>  

两个实体间相互关联的属性必须标记为@ManyToMany,并相互指定targetEntity属性, 

需要注意的是,有且只有一个实体的@ManyToMany注解需要指定mappedBy属性,指向targetEntity的集合属性名称 

利用ORM工具自动生成的表除了User和Book表外,还自动生成了一个User_Book表,用于实现多对多关联 

再接再厉,解决第三个问题:本来想排一下序,怎么也这么难啊。难也得搞定是吧^_^,前面以为orderBy按字段来呢,结果一个文档,原来是被关联实体中一个属性,哎,细心还是好啊。再补充一点:orderby的方式对list是有效的,set和map用mapkey。

两个实体间相互关联的属性必须标记为@ManyToMany,并相互指定targetEntity属性,

需要注意的是,有且只有一个实体的@ManyToMany注解需要指定mappedBy属性,指向targetEntity的集合属性名称 

利用ORM工具自动生成的表除了User和Book表外,还自动生成了一个User_Book表,用于实现多对多关联 

以下列出基本用法解析:

 

一对一关联

@OneToOne

一对一的主键关联实在看不出意义何在.反倒是获取实例的时候可能多N多没用的数据,所以不深究了...至于外键关联,直接看下面的一对多,多对一.

一对多,多对一关联

表字段说明

OneObject 表:

one_id 主键

ManyObject 表:

many_id 主键

one_id 外键,与OneObject 的主键关联

 

单向一对多

OneObject:

@OneToMany

@JoinColumn(name="one_id")

private Set<ManyObject> mb = newHashSet<ManyObject>();

ManyObject:

private int one_id; //这个就是和@JoinColumn(name="one_id")
对应的 one_id .

不需要注解.

单向多对一

OneObject:

不需要注解.

ManyObject:

@ManyToOne

@JoinColumn(name="one_id") //只需要在ManyObject指定外键为one_id.它就会去找OneObject
的主键来对应.

private OneObject one;

双向一对多,双向多对一

OneObject:

@OneToMany(mappedBy="one") //告诉hibernate关联去找 one .

private Set<ManyObject> mb = newHashSet<ManyObject>();

ManyObject:

@ManyToOne

@JoinColumn(name="one_id") //注意,在这里指定外键名后,不要在写private
int one_id; 和它的get / set
方法了.这个改由hibernate维护.写上是要报错的.

private OneObject one; //这个对应的就是@OneToMany(mappedBy="one")
的 one.

多对多关联

表字段说明

ManyA 表:

a_id 主键

ManyB 表:

b_id 主键

A_B 表:(保存映射关系的中间表)

t_Aid 外键,与ManyA 的主键关联

t_Bid 外键,与ManyB 的主键关联

单向多对多

ManyA:

@ManyToMany

@JoinTable(

name="A_B", //中间表名

joinColumns={@JoinColumn(name="t_Aid")}, //设置ManyA自己在中间表的对应外键

inverseJoinColumns={@JoinColumn(name="t_Bid") //设置对方(ManyB)在中间表的对应外键

}

)

private Set<ManyB> mb = new HashSet<ManyB>();

ManyB:

不需要注解.

 

双向多对多

ManyA:

@ManyToMany

@JoinTable(

name="A_B", //中间表名

joinColumns={@JoinColumn(name="t_Aid")}, //设置ManyA自己在中间表的对应外键

inverseJoinColumns={@JoinColumn(name="t_Bid") //设置对方(ManyB)在中间表的对应外键

}

)

private Set<ManyB> mb = new HashSet<ManyB>();

ManyB:

@ManyToMany(mappedBy="mb") //告诉hibernate维护这个关联去找另一个对象的注解就可以了.不需要重复写.

private Set<ManyA> ma = new HashSet<ManyA>();

注:以上注释,ManyA的更删会影响到中间表A_B.但ManyB的更删不会影响到.假如2边都需要影响A_B表,则ManyB也写注解.注意joinColumns 以及 inverseJoinColumns 的值对应不同.(其实就是两边都做成单向多对多)

ManyB:

@ManyToMany

@JoinTable(

name="A_B", 

joinColumns={@JoinColumn(name="t_Bid")}, 

inverseJoinColumns={@JoinColumn(name="t_Aid") 

}

)

private Set<ManyA> ma = new HashSet<ManyA>();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate关联注解