博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate映射关系
阅读量:6866 次
发布时间:2019-06-26

本文共 2905 字,大约阅读时间需要 9 分钟。

  hot3.png

前言

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来说明

@Entitypublic 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
getAddresses() { ... } }@Embeddablepublic 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")/** * 多对多,双向关联映射 */

转载于:https://my.oschina.net/suemi/blog/697186

你可能感兴趣的文章
httpd, php, mariadb分离式的部署在三台主机上测试性能
查看>>
PL/SQL Developer结合oracle精简客户端配置说明
查看>>
每次打开office里的word,自动出现安装配置
查看>>
Skype For Business online混合部署(二)--混合部署配置
查看>>
Dojo AMD介绍
查看>>
Rsync忽略文件夹或目录
查看>>
linux基础命令Ⅱ
查看>>
Linux下阻塞与非阻塞IO
查看>>
centos6-7 yum安装php的方法
查看>>
No result defined for action
查看>>
Linux下批量管理工具PSSH
查看>>
打印hibernate的SQL语句的几种办法
查看>>
nginx 高级配置示例.
查看>>
HTML知识点笔记(持续添加+++++++)
查看>>
忘记了root密码怎么办
查看>>
Tomcat 警告:consider increasing the maximum size of the cache
查看>>
Linux 用户,组,权限小练习
查看>>
DNS服务在网络中的应用
查看>>
大步迈入3G 时代,如何选择性价比高的资费呢?
查看>>
iPhone异常关机怎么解决?中国消费者协会请苹果10日内答复
查看>>