摘要:前言首先声明,这是一篇转发博客,不属于原创。关系映射有下面几种类型一对一外键关联映射单向一对一外键关联,使用,并设置了级联操作。设置了外键的名称为数据库字段名,如果不设置,则默认为另一类的属性名,外键的值是唯一的。
前言
首先声明,这是一篇转发博客,不属于原创。但是感觉很有用,所以在本人的博客中记录下来。
Hibernate Annotation关系映射有下面几种类型:
一对一外键关联映射(单向)java一对一外键关联映射(双向)
@OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="userid",unique=true) /* 一对一外键关联,使用@OneToOne,并设置了级联操作。@JoinColum设置了外键的名称为userid(数据库字段名),如果不设置,则默认为另一类的属性名+ _id,外键的值是唯一的(unique)。*/
Class1里与上面一样,对于Class2:
java
@OneToOne(mappedBy="class2",cascade=CascadeType.ALL)
注意:
需要加上mappedBy="class2",如果不加上的话,Class2也会生成一个外键(class1_id),mappedby="class2"需要指向与他关联对象的一个属性,说明双向关联关系中,有且仅有一端是作为主体(owner)端存在的,主体端负责维护联接列,对于不需要维护这种关系的从表则通过mappedBy属性进行声明,mappedBy的值指向主体的关联属性
规律:只有是双向关联关系,都加上mappedby
(嵌入式对象)组件映射将另外一个类成为实体类的一部分进行映射,举个例子,用户的教育经历完全依附于用户表,但是又有比较复杂的结构,就可以使用Embedded
注意:
成为其他实体类一部门的类不要注解为@Entity 实体类!
使用@Embedded对组件类注解。
组件属性名名为了保证不与实体类属性名冲突,可以使用如下注解:
java
@AttributeOverrides( { @AttributeOverride(name="xx",column=@Column(name="xxx")), @AttributeOverride(name="xx2",column=@Column(name="xxx2")), } )
在嵌入式对象里,对其属性使用@column进行设置
下面使用一个例子结合@ElementCollection来说明
java@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 getAddresses() { ... } } @Embeddable public class Address { public String getStreet1() {...} [...] } //注意,Embedded对象不能再含有Collection了,同时一张表是不可避免的一对多关联映射(单向)
java一对多关联映射(双向)
@OneToMany @JoinColumn(name="orgid") /** * 一对多注解@OneToMany(单向) * 如果只写@OneToMany的话,hibernate会建一张中间表来 * 维护他们之间的关系, * 加上@JoinColumn(name="orgid"),则不会建中间表,他会在 * 多的一端加上外键orgid,来维护他们之间的关系 */
对于一端:
java
@OneToMany(mappedBy="org") @JoinColumn(name="orgid") /** * 一对多双向,在一的一端中设置mappedBy * 说明多的一端为主导 * 如果指定了外键字段名称,则多的一端也需要指定相同的字段名称 */
对于多端:
java多对一关联映射
@ManyToOne @JoinColumn(name="orgid") /** * 一对多双向 * 需要指定外键与一的一端给的外键名称一致,@JoinColumn(name="orgid") * 也可以不指定,如果在多的一端不指定,则一的一端也不能指定 * 否则为生成两个外键 */
在多的一端配置:
java多对多关联映射(单向)
@ManyToOne(targetEntity=Organization.class) @JoinColumn(name="orgid") //多对一注解@ManyToOne //targetEntity指定了关联对象 //@JoinColumn(name="orgid")指定生产的外键的字段名,默认是org_id
java多对多关联映射(双向)
@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端:
java
@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://www.ucloud.cn/yun/64395.html
摘要:前言前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的因此,本博文主要讲解关联映射集合映射需求分析当用户购买商品,用户可能有多个地址。数据库表我们一般如下图一样设计数据库表,一般我们不会在表设计多个列来保存地址的。 前言 前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的...因此,本博文主要讲解关联映射 集合映射 需求分析:当用户购买商品,用户...
摘要:使用反射机制,而不是字节码增强程序来实现透明性。工具类初始化失败为空,请检查配置文件瞬时对象与持久化对象测试代码当前在数据库中没有记录进行关联,所以此时是瞬时对象。将持久化当前在数据库有唯一一条记录对应,所以此时是持久化对象。 showImg(https://segmentfault.com/img/bVbo4at?w=2313&h=642); 一、什么是Hibernate? Hibe...
摘要:所以设计的表名映射格式为,如果不加注解,则将实体名按照默认的生成规则进行生成,如果加了注解,则填写的就作为表名映射,不进行任何处理。云智命名策略实体与数据表名的关系配置然后将该项配置修改为我们自己建立的实现类。 问题描述 Hibernate映射介绍 Hibernate中,默认的生成关系是将我们驼峰命名的实体进行拼接下划线同时转小写。 showImg(https://segmentfa...
摘要:在使用作为应用时推荐使用作为开发工具导入相应的的包到文件下的目录下关于开发中导入的说明在此提供一个包下载链接,地址百度云盘下载好以后解压到某个文件夹里解压好以后,开发所需要的包在解压后的包下,将该文件夹下的包复制到项目中另外还需 1.在使用Hibernate作为orm应用时推荐使用myeclipse作为开发工具2.导入相应的Hibernate的jar包到webroot文件下的lib目录...
阅读 2174·2019-08-30 15:54
阅读 1918·2019-08-30 13:49
阅读 627·2019-08-29 18:44
阅读 800·2019-08-29 18:39
阅读 1076·2019-08-29 15:40
阅读 1498·2019-08-29 12:56
阅读 3103·2019-08-26 11:39
阅读 3041·2019-08-26 11:37