hibernate注解版关联映射

来源:互联网 发布:淘宝子账号权重设置 编辑:程序博客网 时间:2024/05/29 08:47

属性介绍:

1.多对一:

[html] view plain copy
 print?
  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. 
示例: 
@ManyToOne表示一个多对一的映射,该注解标注的属性通常是数据库表的外键 
optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true 
fetch:表示抓取策略,默认为FetchType.EAGER 
cascade:表示默认的级联操作策略,可以指定为ALL,PERSIST,MERGE,REFRESH和REMOVE中的若干组合,默认为无级联操作 
targetEntity:表示该属性关联的实体类型.该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity. 
示例: 
@ManyToOne表示一个多对一的映射,该注解标注的属性通常是数据库表的外键 
optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true 
fetch:表示抓取策略,默认为FetchType.EAGER 
cascade:表示默认的级联操作策略,可以指定为ALL,PERSIST,MERGE,REFRESH和REMOVE中的若干组合,默认为无级联操作 
targetEntity:表示该属性关联的实体类型.该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity. 
示例:

[java] view plain copy
 print?
  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.

[html] view plain copy
 print?
  1. <span style="font-size:16px;">@JoinColumn</span>  


@JoinColumn和@Column类似,介量描述的不是一个简单字段,而一一个关联字段,例如.描述一个@ManyToOne的字段. 
name:该字段的名称.由于@JoinColumn描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定. 
例如,实体Order有一个user属性来关联实体User,则Order的user属性为一个外键, 
其默认的名称为实体User的名称+下划线+实体User的主键名称 
示例:见@ManyToOne

3.一对多:

[html] view plain copy
 print?
  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也应该被全部删除 
示例: 

[java] view plain copy
 print?
  1. <span style="font-size:16px;">@OneTyMany(cascade=ALL)   
  2.     public List getOrders() {   
  3.        return orders;   
  4.     }   
  5. </span>  


4.

[html] view plain copy
 print?
  1. <span style="font-size:16px;">@OneToOne(fetch=FetchType,cascade=CascadeType)</span>  


@OneToOne描述一个一对一的关联 
fetch:表示抓取策略,默认为FetchType.LAZY 
cascade:表示级联操作策略 
示例: 
@OneToOne描述一个一对一的关联 
fetch:表示抓取策略,默认为FetchType.LAZY 
cascade:表示级联操作策略 
示例: 

[html] view plain copy
 print?
  1. <span style="font-size:16px;">@OneToOne(fetch=FetchType.LAZY)   
  2.     public Blog getBlog() {   
  3.        return blog;   
  4.     }   
  5. </span>  


5.

[html] view plain copy
 print?
  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关联

[java] view plain copy
 print?
  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 = new HashSet<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 = new HashSet<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>();


转载地址:http://blog.csdn.net/yongjian1092/article/details/7598901

0 0
原创粉丝点击