hibernate注解版关联映射

属性介绍:

1.多对一:

@ManyToOne(fetch=FetchType,cascade=CascadeType)


@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.
示例:

//订单Order和用户User是一个ManyToOne的关系 
    //在Order类中定义 
    @ManyToOne() 
    @JoinColumn(name="USER") 
    public User getUser() { 
       return user; 
    } 


2.

@JoinColumn


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

3.一对多:

@OneToMany(fetch=FetchType,cascade=CascadeType) 


@OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段.
fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存
cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新删除
例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除
示例:
@OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段.
fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存
cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新删除
例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除
示例:

@OneTyMany(cascade=ALL) 
    public List getOrders() { 
       return orders; 
    } 


4.

@OneToOne(fetch=FetchType,cascade=CascadeType)


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

@OneToOne(fetch=FetchType.LAZY) 
    public Blog getBlog() { 
       return blog; 
    } 


5.

@ManyToMany 


@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关联

@Entity 
    public class User { 
       private List books; 
       @ManyToMany(targetEntity=package.Book.class) 
       public List getBooks() { 
           return books; 
       } 
       public void setBooks(List books) { 
           this.books=books; 
       } 
    }   

    @Entity 
    public class Book { 
       private List users; 
       @ManyToMany(targetEntity=package.Users.class, mappedBy="books") 
       public List getUsers() { 
           return users; 
       } 

       public void setUsers(List users) { 
           this.users=users; 
       } 
    } 


两个实体间相互关联的属性必须标记为@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>();

你可能感兴趣的:(Hibernate,数据库,list,orm,user,books)