本文主要介绍spring-boot如何配置JPA以及如何进行实体间的一对多配置。依赖准备在spring-boot中使用jpa,需要在项目中输入相关依赖,在pom文件中添加如下内容org.springframework.bootspring-boot-starter-数据-jpaorg.springframework.bootspring-boot-starter-jdbcmysqlmysql-connector-javaruntime项目的配置文件需要配置数据库链接和jpa:spring:datasource:url:jdbc:mysql://localhost:3306/missyou?characterEncoding=utf-8&serverTimezone=GMT%2B8用户名:root密码:12345678jpa:hibernate:ddl-auto:update#只为新添加的实体创建表properties:hibernate:show_sql:true#对数据库进行操作时打印出sql,方便生产环境排查问题format_sql:true#Format在打印sql的时候,jpa貌似方便实战一对多关系先定义两个实体类Banner和BannerItem、一个Banner可以对应多个BannerItem,属于典型的一对多关系@EntitypublicclassBanner{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privatelongid;@Column(length=16)私有字符串名称;@Transient//表示该字段不会映射到表中的字段privateStringdescription;私有字符串img;私有字符串标题;@OneToMany私有列表项目;//关联属性,导航属性}@EntitypublicclassBannerItem{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;私有字符串img;私有字符串关键字;私有短类型;privateStringname;}先解释一下上面代码中的一些注解:@Entity将当前类标记为一个实体,对应数据库中的一个表,用来表示这个表的信息,类名默认为表名,jpa会根据命名规则自动小写加下划线,比如BannerItem实体,生成的表名是banner_item@Id表名mark字段会作为主键@GeneratedValue(strategy=GenerationType.IDENTITY)设置自增长的id@Column(length=16)设置字段的属性,比如长度,是否为空,是否唯一等。@OneToMany可以使用两个实体建立一对多关系,即也就是说,一个Banner可以包含多个BannerItem@Transient注解,表示当前标记的字段不会映射到数据库表的字段,也就是说生成的表不会包含这个字段。这时候如果你运行程序,就会在数据库中创建对应的表:generatedhere我们创建了三个表,banner表和banner_item表。我们知道它们是对应的Banner实体和BannerItem实体。banner_items表呢?在解释这个表之前,我们先看一下这个表的结构:表中只有banner_id和items_id两个字段,分别是banner的id和banner_item的id,也就是说这个表相当于一个关系表,多对多的时候我们只需要一张关系表,现在只有一对多,为什么要生成这张表呢?这是因为我们在定义上述实体时,只是建立了两个实体之间的关系,并没有字段来表示哪个BannerItem属于哪个Banner。如果JPA看到你没做,那我就做,他会自动为你建立这样一个关系表来维护这个归属关系。有没有办法删除这个表?当然。这时候就需要增加一个外键字段来表示一个banner_item属于哪个banner。让我们修改上面的实体定义:在Banner实体中进行以下更改:@OneToMany@JoinColumn(name="bannerId")privateListitems;@JoinColumn注解指定外键BannerItem实体增加一个字段:bannerIdprivateLongbannerId;删除以前的表并重新运行程序。此时只生成了两张表,会在banner_item表中新增一个外键字段。下面我们用一个程序例子来验证以上内容:1.构造数据表结构已经构造完成,现在我们填充一些数据,使用JPA进行数据查询INSERTINTOmissyou.banner(id,img,name,title)VALUES(1,'http://sss.jpg','置顶横幅','置顶横幅');INSERTINTOmissyou.banner(id,img,name,title)VALUES(2,'http://aaa.jpg','topbanner2','topbanner2');INSERTINTOmissyou.banner_item(id,banner_id,img,keyword,name,type)VALUES(1,1,'http://www.jpj','衣服','阿迪促销',1);INSERTINTOmissyou.banner_item(id,banner_id,img,keyword,name,type)VALUES(2,1,'http://www.jpj','shoes','阿迪促销',1);2、新建ControllerservicerepositoryBannerRepository存储层,主要负责读取数据库@RepositorypublicinterfaceBannerRepositoryextendsJpaRepository{BannerfindOneById(Longid);BannerfindOneByName(Stringname);}服务层,具体业务逻辑@ServicepublicclassBannerServiceImplimplementsBannerService{@AutowiredprivateBannerRepositorybannerRepository;@OverridepublicBannergetByName(字符串名称){returnbannerRepository.findOneByName(名字);}}controller层,负责接收客户端请求返回数据@GetMapping("/banner/name/{name}")publicBannergetBannerByName(@PathVariableStringname){returnbannerService.getByName(name);}请求接口:你可以看到已经查询到数据了。双向一对多。上面的例子是查看一组与banner_id相关联的banner_items,但是在某些场景下我们可能需要通过某个item_id来查看它属于哪个banner,那么这就是一种反向一对多,那么我们看看如何配置这个总反向一对多。我们之前配置了一个项目属性@OneToMany@JoinColumn(name="bannerId")privateListitems;这个属性可以帮助我们定位到与某个banner关联的一组bannerItem,可以称之为navigationproperty,反之亦然,如何从一个item中定位到一个Banner,如何设置navigation属性?首先需要在BannerItem实体类中添加一个banner属性,使用如下注解标记@ManyToOne@JoinColumn(name="bannerId")privateBannerbanner;修改Banner实体@OneToMany(mappedBy="banner")privateList项;这里实际上是将@JoinColumn(name="bannerId")移动到BannerItem中。而在BanenrItem中,应该删除之前定义的外键字段bannerId。这是因为在设置双向一对多关系时,默认会在banner_item表中生成一个外键。如果自己再写一个,会造成重复,程序会报错。那么如果要指定的话,也可以这样配置@ManyToOne@JoinColumn(insertable=false,updatable=false,name="bannerId")privateBannerbanner;总结以上就是我们介绍的关于如何在spring-boot中进行实体间的单向一对多和双向一对多的配置,关于在实际项目中使用哪种方法,还是结合自己的业务,一般不需要进行双向配置,一般也不会设置物理外键,我们后面会讨论如何配置多对多以及如何去除物理外键。欢迎到我的博客看看,还有更多实测内容!!