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进行双向一对多配置...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java国家电网面试试题_国家电网笔试面
- 下一篇: html table样式_CSS表格样式