Hibernate关联映射(注解版)

属性介绍:

1.多对一:

1.  <span style="font-size:16px;">@ManyToOne(fetch=FetchTypecascade=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>();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值