设计公司的网站,自己做抽奖网站违法吗,网站流量统计平台,wordpress能注册本片文章我们主要介绍spring-boot如何进行JPA的配置以及如何进行实体间的一对多配置。 依赖准备 要在spring-boot使用jpa需要在项目中有进入相关的依赖#xff0c;pom文件里加入下面内容 dependencygroupIdorg.springframework.boot/groupIdartif…本片文章我们主要介绍spring-boot如何进行JPA的配置以及如何进行实体间的一对多配置。 依赖准备 要在spring-boot使用jpa需要在项目中有进入相关的依赖pom文件里加入下面内容 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactId
/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId
/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope
/dependency 项目的配置文件中需要对数据库链接以及jpa进行配置 spring:datasource:url: jdbc:mysql://localhost:3306/missyou?characterEncodingutf-8serverTimezoneGMT%2B8username: rootpassword: 12345678jpa:hibernate:ddl-auto: update # 只针对新增的entity创建表properties:hibernate:show_sql: true # 在对数据库进行操作的时候打印出sql方便在生产环境排查问题format_sql: true # 打印sql的时候进行格式化看起来方便 jpa实战 一对多关系先定义两个实体类Banner和BannerItem一个Banner可以对应多个BannerItem属于典型的一对多的关系 Entity
public class Banner {IdGeneratedValue(strategy GenerationType.IDENTITY)private long id;Column(length 16)private String name;Transient // 表明这个字段不会映射到表中的字段private String description;private String img;private String title;OneToManyprivate ListBannerItem items; // 关联属性导航属性} Entity
public class BannerItem {IdGeneratedValue(strategy GenerationType.IDENTITY)private Long id;private String img;private String keyword;private Short type;private String name;
} 先对上面代码中的一些注解进行说明 Entity标记当前类为一个实体对应数据库中的一张表用来表示这张表信息类名默认就是表名jpa会根据命名规则自动小写并加下划线比如BannerItem实体生成的表名就是banner_item Id表名标记的字段将作为主键 GeneratedValue(strategy GenerationType.IDENTITY) 设置id为自增长 Column(length 16) 设置字段的属性比如长度、是否为空、是否唯一等 OneToMany可以使用两个实体建立一对多的关系也就是一个Banner可以包含多个BannerItem Transient注解表示被标记的当前字段不会映射到数据库表的字段也就是说生成的表中不会包含这个字段 此时运行程序就会在数据库中创建对应的表 这里生成了三张表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)
private ListBannerItem items; JoinColumn注解指定外键 BannerItem实体增加一个字段bannerId private Long bannerId; 删除之前的表重新运行程序 这个时候生成的表就只有两个了在banner_item表里会新增一个外键字段。 下面我们通过一个程序实例来验证上面的内容 1、构造数据 表结构已经构造好了现在我们填充一些数据来使用JPA进行数据查询 INSERT INTO missyou.banner (id, img, name, title) VALUES (1, http://sss.jpg, 顶部banner, 顶部banner);
INSERT INTO missyou.banner (id, img, name, title) VALUES (2, http://aaa.jpg, 顶部banner2, 顶部banner2);INSERT INTO missyou.banner_item (id, banner_id, img, keyword, name, type) VALUES (1, 1, http://www.jpj, 衣服, 阿迪促销, 1);
INSERT INTO missyou.banner_item (id, banner_id, img, keyword, name, type) VALUES (2, 1, http://www.jpj, 鞋, 阿迪促销, 1);2、新建Controllerservicerepository BannerRepository仓储层,主要负责读取数据库 Repository
public interface BannerRepository extends JpaRepositoryBanner, Long {Banner findOneById(Long id);Banner findOneByName(String name);
} sevice层具体的业务逻辑 Service
public class BannerServiceImpl implements BannerService{Autowiredprivate BannerRepository bannerRepository;Overridepublic Banner getByName(String name) {return bannerRepository.findOneByName(name);}
} controller层负责接收客户端请求返回数据 GetMapping(/banner/name/{name})
public Banner getBannerByName(PathVariable String name){return bannerService.getByName(name);
} 请求接口 可以看到数据已经查询出来了。 双向一对多上面的示例是根据banner_id去查关联的一组banner_item但是有些场景我们可能需要通过某个item_id去查是属于哪个banner那这就是一种的反向的一对多接下来我们看一下这总反向的一对多如何配置。 我们之前配置了一个items属性 OneToMany
JoinColumn(name bannerId)
private ListBannerItem items; 这个属性就可以帮我们定位到某个banenr关联的一组bannerItem可以叫做导航属性那么反过来如何从一个item定位到一个Banner怎么设置导航属性 首先需要在BannerItem实体类里面增加一个banner属性并使用如下注解进行标记 ManyToOne
JoinColumn(name bannerId)
private Banner banner; 修改Banner实体 OneToMany(mappedBy banner)
private ListBannerItem items; 这里其实就是把JoinColumn(name bannerId)移动到BannerItem里面。并且在BanenrItem里要删除掉之前定义的外键字段bannerId。 这是因为在设置双向一对多的关系时会默认在banner_item表里生成一个外键如果自己再写一个就会造成重复程序就会报错。 那如果自己很想指定也可以进行如下配置 ManyToOne
JoinColumn(insertable false, updatable false, name bannerId)
private Banner banner; 总结 以上就是我们介绍的关于在spring-boot中如何进行实体间的单向一对多和双向一对多的配置关于要在实际项目如何使用哪一种方式还是要结合自己的业务一般不需要进行双向的配置而且一般都不会去设置物理外键后面我们再讨论如何进行多对多的配置以及如何去除物理外键。 欢迎大家去 我的博客 瞅瞅里面有更多关于测试实战的内容哦