您的位置:首页 > 其它

Hibernate映射关系(注解方式)

2016-03-04 10:57 323 查看


前言

首先声明,这是一篇转发博客,不属于原创。但是感觉很有用,所以在本人的博客中记录下来。
Hibernate Annotation关系映射有下面几种类型:


一对一外键关联映射(单向)

@OneToOne(cascade=CascadeType.ALL)

@JoinColumn(name="userid",unique=true)

/*    一对一外键关联,使用@OneToOne,并设置了级联操作。@JoinColum设置了外键的名称为userid(数据库字段名),如果不设置,则默认为另一类的属性名+ _id,外键的值是唯一的(unique)。*/


一对一外键关联映射(双向)

Class1里与上面一样,对于Class2:
@OneToOne(mappedBy="class2",cascade=CascadeType.ALL)

注意:需要加上mappedBy="class2",如果不加上的话,Class2也会生成一个外键(class1_id),mappedby="class2"需要指向与他关联对象的一个属性,说明双向关联关系中,有且仅有一端是作为主体(owner)端存在的,主体端负责维护联接列,对于不需要维护这种关系的从表则通过mappedBy属性进行声明,mappedBy的值指向主体的关联属性
规律:只有是双向关联关系,都加上mappedby


(嵌入式对象)组件映射

将另外一个类成为实体类的一部分进行映射,举个例子,用户的教育经历完全依附于用户表,但是又有比较复杂的结构,就可以使用Embedded
注意:成为其他实体类一部门的类不要注解为@Entity 实体类!使用@Embedded对组件类注解。组件属性名名为了保证不与实体类属性名冲突,可以使用如下注解:
@AttributeOverrides(
{
@AttributeOverride(name="xx",column=@Column(name="xxx")),

@AttributeOverride(name="xx2",column=@Column(name="xxx2")),

}
)
在嵌入式对象里,对其属性使用@column进行设置下面使用一个例子结合@ElementCollection来说明
@Entity
public class User {
[...]
public String getLastname() { ...}

@ElementCollection
@CollectionTable(name="Addresses", joinColumns=@JoinColumn(name="user_id"))
@AttributeOverrides({
@AttributeOverride(name="street1", column=@Column(name="fld_street"))
})
public Set<Address> getAddresses() { ... }
}

@Embeddable
public class Address {
public String getStreet1() {...}
[...]
}
//注意,Embedded对象不能再含有Collection了,同时一张表是不可避免的


一对多关联映射(单向)

@OneToMany

@JoinColumn(name="orgid")

/**

* 一对多注解@OneToMany(单向)

* 如果只写@OneToMany的话,hibernate会建一张中间表来

* 维护他们之间的关系,

* 加上@JoinColumn(name="orgid"),则不会建中间表,他会在

* 多的一端加上外键orgid,来维护他们之间的关系

*/


一对多关联映射(双向)

对于一端:
@OneToMany(mappedBy="org")

@JoinColumn(name="orgid")

/**

* 一对多双向,在一的一端中设置mappedBy

* 说明多的一端为主导

* 如果指定了外键字段名称,则多的一端也需要指定相同的字段名称

*/

对于多端:
@ManyToOne

@JoinColumn(name="orgid")

/**

* 一对多双向

* 需要指定外键与一的一端给的外键名称一致,@JoinColumn(name="orgid")

* 也可以不指定,如果在多的一端不指定,则一的一端也不能指定

* 否则为生成两个外键

*/


多对一关联映射

在多的一端配置:
@ManyToOne(targetEntity=Organization.class)

@JoinColumn(name="orgid")

//多对一注解@ManyToOne

//targetEntity指定了关联对象

//@JoinColumn(name="orgid")指定生产的外键的字段名,默认是org_id


多对多关联映射(单向)

@ManyToMany

/**

* 多对多映射:注解@ManyToMany(单向)

* 默认情况下,hibernate会自动的创建一张中间表,

* 来维护多对多关系

* 默认中间表的名称 :user_role中间表,字段的名称user_id role_id

* 如果想更换表名和字段名称,注解如下:

*/

@JoinTable(name="t_u_r",

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

inverseJoinColumns={@JoinColumn(name="r_id")}

)


多对多关联映射(双向)

举个例子Role表和User表,用户可以有多个角色,角色也可以属于多个用户
User端:
@ManyToMany

/**

* 多对多映射:注解@ManyToMany(单向)

* 默认情况下,hibernate会自动的创建一张中间表,

* 来维护多对多关系

* 默认中间表的名称 :user_role中间表,字段的名称user_id role_id

* 如果想更换表名和字段名称,注解如下:

*/

@JoinTable(name="t_u_r",

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

inverseJoinColumns={@JoinColumn(name="r_id")}

)
/*** @JoinTable(name="t_u_r",* 指定中间表的表名* joinColumns={@JoinColumn(name="u_id")},* 指定当前对象的外键* inverseJoinColumns={@JoinColumn(name="r_id")}* 指定关联对象的外键*/

Role端:
@ManyToMany(mappedBy="role")

/**

* 多对多,双向关联映射

*/


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: