在使用实体类生成对应的数据库表时,很多的时候都会遇到这种情况:在一个实体类中引用另外的实体类,一般遇上这种情况,我们使用@OneToOne@OneToMany@ManyToOne@ManyToMany这4个注解比较多,但是好奇害死猫,除了这四个有没有别的使用情况,尤其是一个实体类要在多个不同的实体类中进行使用,而本身又不需要独立生成一个数据库表,这就是需要@Embedded@Embeddable的时候了,下面分成4类来说明在一个实体类中引用另外的实体类的情况,具体的数据库环境是MySQL 5.7。

使用的两个实体类如下:

Address类

public class Address implements Serializable{private static final long serialVersionUID = 8849870114128959929L;private String country;private String province;private String city;private String detail;//setter、getter
}

Person类:

@Entity
public class Person implements Serializable{private static final long serialVersionUID = 8849870114127659929L;@Id@GeneratedValueprivate Long id;@Column(nullable = false)private String name;@Column(nullable = false)private Integer age;private Address address;//setter、getter
}

1、 两个注解全不使用

当这两个注解都不使用时,那么两个实体类和上面的相同,那么生成的表结构如下:

Address属性字段会映射成tinyblob类型的字段,这是用来存储不超过255字符的二进制字符串的数据类型,显然我们通常不会这么使用。

2、 只使用@Embeddable

我们在Address实体类上加上@Embeddable注解,变成如下类:

@Embeddable
public class Address implements Serializable{private static final long serialVersionUID = 8849870114128959929L;private String country;private String province;private String city;private String detail;//setter、getter
}

而Person实体类不变,生成的数据库表结构如下:

可以看出这次是把Address中的字段映射成数据库列嵌入到Person表中了,而这些字段的类型和长度也使用默认值。如果我们在Address中的字段中设置列的相关属性,则会按照我们设定的值去生成,如下Address类:

@Embeddable
public class Address implements Serializable{private static final long serialVersionUID = 8849870114128959929L;@Column(nullable = false)private String country;@Column(length = 30)private String province;@Column(unique = true)private String city;@Column(length = 50)private String detail;//setter、getter
}

生成的表结构如下:


我们在Address中配置的属性全部成功映射到Person表中。

3、 只使用@Embedded

这里我们只在Person中使用@Embedded,如下:

@Entity
public class Person implements Serializable{private static final long serialVersionUID = 8849870114127659929L;@Id@GeneratedValueprivate Long id;@Column(nullable = false)private String name;@Column(nullable = false)private Integer age;@Embeddedprivate Address address;//setter、getter
}

Adddress类和最开始的不同POJO类相同,此时生成的表结构如下:

可以看出这个表结构和在Address中只使用@Embeddable注解时相同,在进入深一步试验,我们在Address中加入列属性,但是不使用@Embeddable注解会发生什么?
Address类如下:

public class Address implements Serializable{private static final long serialVersionUID = 8849870114128959929L;@Column(nullable = false)private String country;@Column(length = 30)private String province;@Column(unique = true)private String city;@Column(length = 50)private String detail;//setter、getter
}

生成数据表结构如下:

所以只使用@Embedded和只使用@Embeddable产生的效果是相同的。

4、 两个注解全使用

既然单独使用@Embedded或者只使用@Embeddable都会产生作用,那么这两个都使用效果也一定是一样的,我们平时也是这么用的。所以在这部分我们就不演示和上面相同的效果了,而是说两个深入的话题。

4.1 覆盖@Embeddable类中字段的列属性

这里就要使用另外的两个注解@AttributeOverrides@AttributeOverride,这两个注解是用来覆盖@Embeddable类中字段的属性的。

  • @AttributeOverrides:里面只包含了@AttributeOverride类型数组;
  • @AttributeOverride:包含要覆盖的@Embeddable类中字段名name和新增的@Column字段的属性;

使用如下:
Person类如下:

@Entity
public class Person implements Serializable{private static final long serialVersionUID = 8849870114127659929L;@Id@GeneratedValueprivate Long id;@Column(nullable = false)private String name;@Column(nullable = false)private Integer age;@Embedded@AttributeOverrides({@AttributeOverride(name="country", column=@Column(name = "person_country", length = 25, nullable = false)),@AttributeOverride(name="city", column = @Column(name = "person_city", length = 15))})private Address address;//setter、getter
}

Address类如下:

@Embeddable
public class Address implements Serializable{private static final long serialVersionUID = 8849870114128959929L;@Column(nullable = false)private String country;@Column(length = 30)private String province;@Column(unique = true)private String city;@Column(length = 50)private String detail;//setter、getter
}

生成的数据表如下:

可以看出我们的@AttributeOverrides@AttributeOverride两个注解起作用了。

4.2 多层嵌入实体类属性

上面所有的例子都是使用两层实体类嵌入,其实这种实体类的嵌入映射是可以使用多层的,具体的例子如下。
我们新建立一个类Direction表示方位如下:

@Embeddable
public class Direction implements Serializable{@Column(nullable = false)private Integer longitude;private Integer latitude;
}

Address如下:

@Embeddable
public class Address implements Serializable{private static final long serialVersionUID = 8849870114128959929L;@Column(nullable = false)private String country;@Column(length = 30)private String province;@Column(unique = true)private String city;@Column(length = 50)private String detail;@Embeddedprivate Direction direction;
}

Person类如下:

@Entity
public class Person implements Serializable{private static final long serialVersionUID = 8849870114127659929L;@Id@GeneratedValueprivate Long id;@Column(nullable = false)private String name;@Column(nullable = false)private Integer age;@Embedded@AttributeOverrides({@AttributeOverride(name="direction.latitude", column=@Column(name = "person_latitude")),@AttributeOverride(name="direction.longitude", column = @Column(name = "person_longitude"))})private Address address;
}

生成的数据表如下:

在上面需要注意如下几点:

  • 在Person中定义Direction中的属性时,需要用”.”将所有相关的属性连接起来;
  • 在Direction中longitude属性定义为not null,但是由于使用了@AttributeOverride注解,其中虽然没有定义null属性,但是这时使用的是默认的nullable属性,默认为true;

Hibernate中@Embedded和@Embeddable注解的使用相关推荐

  1. Hibernate中,mappedBy和注解@JoinColumn的对比

    mappedBy 我们知道,mappedBy用于指定具有双向关系的两个实体中.哪个实体是被关联处理的.它有如下四个特点: 1.只有OneToOne,OneToMany,ManyToMany上才有map ...

  2. JPA中的@Embedded和@Embeddable注释的使用

    JPA中的@Embedded和@Embeddable注释 概念很枯燥, 通过代码理解吧 模拟场景 1.建表,插入一条数据 create table if not exists `User`(`id` ...

  3. JPA+Hibernate中常用的注解

    JPA+Hibernate中常用的注解 JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体[对 ...

  4. Hibernate中的注解说明

    Hibernate中注解注解比较多,常用的也就那么几个,在这里把Hibernate中的注解汇总总结一下. @Entity:将一个类声明为一个实体bean,即一个持久化POJO; @Id:声明bean的 ...

  5. hibernate中@Entity和@Table的区别

    Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库. 这些普通Java对象被称作Entity Bean. 除了是用Java Pers ...

  6. Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例

    Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例 转自:通过注解的方式集成Spring 4 MVC+Hibernate 4+MySQL+Maven,开发项目样例 ...

  7. hibernate(七) hibernate中查询方式详解

    序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数 ...

  8. 在Spring、Hibernate中使用Ehcache缓存

    前一篇http://blog.csdn.net/ibm_hoojo/article/details/7739181介绍了Ehcache整合Spring缓存,使用页面.对象缓存:这里将介绍在Hibern ...

  9. Hibernate-ORM:14.Hibernate中的命名查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述命名查询,所谓命名查询是什么呢? Hibernate中允许我们在xml,实体类,甚至注解的方式来编 ...

  10. hibernate 时间 默认值 -(mysql) 注解_注解@ -shihchang

    注解,即元数据,形式化地在代码中添加信息,把元数据与源代码文件结合在一起.注解可以完整地描述程序所需的信息.可以使用注解来简化和自动化重复的过程或代码 javaSE5有三种注解: `@Override ...

最新文章

  1. Imagemagick常用指令
  2. 软件工程-东北师大站-第十二次作业(PSP)
  3. Base64 加密字符串和文件
  4. 最近关于less sass的新手总结
  5. 计算机软件申请专利的困难,对于一个软件系统,在中国现在可以申请专利吗?...
  6. 前端学习(1848)vue之电商管理系统电商系统的开发模式和技术选型
  7. shell命令-if语句
  8. map函数python返回值,Python中map函数使用
  9. 合众朱光林:借O2O模式反馈企业才有价值
  10. maven使用国内源和使用代理
  11. Jmeter性能测试脚本搭建与测试步骤流程
  12. 第八次作业-项目进度计划
  13. MySQL查询数据---单表查询
  14. Unity3D教程笔记——unity初始02
  15. 计算机基础教学模式,浅谈中技计算机基础教学模式
  16. 射线法进行地理空间坐标计算
  17. 面试笔记:面经-网易考拉
  18. 第03章 Python的数据结构、函数和文件--Python for Data Analysis 2nd
  19. python预测彩票模型_python预测下一期双色球号码【机器学习】
  20. 在windows7下农业银行网银(金e顺)不能使用

热门文章

  1. 2017年数学建模大赛A题剖析(第一问求解间距思路分析)
  2. 葫芦娃系列棋牌服务器在哪里,葫芦娃—【关服】葫芦娃关服公告
  3. 这38款超级炫酷的时间轴特效代码案例,总有一款是你需要的
  4. shader 获取法线_Unity Shader-法线贴图(Normal)及其原理
  5. 熔断机制什么意思_什么是熔断机制,熔断机制是什么意思
  6. CSS 字体变形 font-variant属性
  7. 由syms生成函数,求该函数在某些点的数值
  8. SSM框架流浪动物管理系统宠物寄样收养领养宠物收容所管理(idea开发javaweb-javaee-j2ee-springboot)
  9. 论用户体验测试:牛逼的功能千篇一律,好的用户体验万里挑一
  10. 基于深度学习智能问答笔记