日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jeecg boot一对多新增的附表不会主键是一个string_测试开发专题:spring-boot如何使用JPA进行双向一对多配置...

發布時間:2024/9/27 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jeecg boot一对多新增的附表不会主键是一个string_测试开发专题:spring-boot如何使用JPA进行双向一对多配置... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本片文章我們主要介紹spring-boot如何進行JPA的配置以及如何進行實體間的一對多配置。

依賴準備

要在spring-boot使用jpa需要在項目中有進入相關的依賴,pom文件里加入下面內容

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId> </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope> </dependency>

項目的配置文件中需要對數據庫鏈接以及jpa進行配置:

spring:datasource:url: jdbc:mysql://localhost:3306/missyou?characterEncoding=utf-8&serverTimezone=GMT%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 {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private long id;@Column(length = 16)private String name;@Transient // 表明這個字段不會映射到表中的字段private String description;private String img;private String title;@OneToManyprivate List<BannerItem> items; // 關聯屬性,導航屬性} @Entity public class BannerItem {@Id@GeneratedValue(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 List<BannerItem> 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 JpaRepository<Banner, 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 List<BannerItem> items;

這個屬性就可以幫我們定位到某個banenr關聯的一組bannerItem,可以叫做導航屬性,那么反過來,如何從一個item定位到一個Banner,怎么設置導航屬性?

首先需要在BannerItem實體類里面增加一個banner屬性,并使用如下注解進行標記

@ManyToOne @JoinColumn(name = "bannerId") private Banner banner;

修改Banner實體

@OneToMany(mappedBy = "banner") private List<BannerItem> items;

這里其實就是把@JoinColumn(name = "bannerId")移動到BannerItem里面。并且在BanenrItem里要刪除掉之前定義的外鍵字段bannerId。

這是因為在設置雙向一對多的關系時,會默認在banner_item表里生成一個外鍵,如果自己再寫一個就會造成重復,程序就會報錯。

那如果自己很想指定,也可以,進行如下配置

@ManyToOne @JoinColumn(insertable = false, updatable = false, name = "bannerId") private Banner banner;

總結

以上就是我們介紹的關于在spring-boot中如何進行實體間的單向一對多和雙向一對多的配置,關于要在實際項目如何使用哪一種方式,還是要結合自己的業務,一般不需要進行雙向的配置,而且一般都不會去設置物理外鍵,后面我們再討論如何進行多對多的配置以及如何去除物理外鍵。

歡迎大家去 我的博客 瞅瞅,里面有更多關于測試實戰的內容哦!!

總結

以上是生活随笔為你收集整理的jeecg boot一对多新增的附表不会主键是一个string_测试开发专题:spring-boot如何使用JPA进行双向一对多配置...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。