JPA中实现单向一对多的关联关系
場景
JPA入門簡介與搭建HelloWorld(附代碼下載):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937
JPA中實現單向多對一的關聯(lián)關系:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103511623
在上面搭建好JPA的HelloWorld程序后,以及實現單向多對一的關聯(lián)關系后。
單向多對一是在Order層添加Customer信息,即在Order實體類中添加
private Customer customer;這樣多個Order訂單類就能映射到同一個用戶,實現單向多對一。
如果要實現單向一對多的映射關系,就要在Customer層中添加Order的集合,進而實現單向一對多的映射。
注:
博客主頁:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載。
實現
將之前Order中Customer屬性注釋掉
package com.badao.jpa.helloworld;import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table;@Table(name="JPA_ORDERS") @Entity public class Order {private Integer id;private String orderName;//private Customer customer;@GeneratedValue(strategy = GenerationType.IDENTITY)@Idpublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}@Column(name="ORDER_NAME")public String getOrderName() {return orderName;}public void setOrderName(String orderName) {this.orderName = orderName;}//映射單向 n-1 的關聯(lián)關系//使用 @ManyToOne 來映射多對一的關聯(lián)關系//使用 @JoinColumn 來映射外鍵.//可使用 @ManyToOne 的 fetch 屬性來修改默認的關聯(lián)屬性的加載策略//@JoinColumn(name="CUSTOMER_ID")//@ManyToOne/*public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}*/ }然后來到Customer類中添加Order的集合
private Set<Order> orders = new HashSet<>();以及相應的set和get方法
public Set<Order> getOrders() {return orders;}public void setOrders(Set<Order> orders) {this.orders = orders;}然后在get方法中添加注解
@JoinColumn(name="CUSTOMER_ID")@OneToManypublic Set<Order> getOrders() {return orders;}public void setOrders(Set<Order> orders) {this.orders = orders;}注:
使用 @OneToMany 來映射 1-n 的關聯(lián)關系
使用 @JoinColumn 來映射外鍵列的名稱
編寫單元測試類進行測試
??@Testpublic void testOneToManyPersist(){Customer customer = new Customer();customer.setAge(18);customer.setEmail("mm@163.com");customer.setLastName("MM");Order order1 = new Order();order1.setOrderName("O-MM-1");Order order2 = new Order();order2.setOrderName("O-MM-2");//建立關聯(lián)關系customer.getOrders().add(order1);customer.getOrders().add(order2);//執(zhí)行保存操作entityManager.persist(customer);entityManager.persist(order1);entityManager.persist(order2);}運行單元測試類效果
數據庫中訂單表
?
數據庫中用戶表
?
測試一對多Find方法
編寫單元測試方法
?@Testpublic void testOneToManyFind(){Customer customer = entityManager.find(Customer.class, 6);System.out.println(customer.getLastName());System.out.println(customer.getOrders().size());}運行效果
?
注:
默認對關聯(lián)的多的一方使用懶加載的加載策略。
可以使用 @OneToMany 的 fetch 屬性來修改默認的加載策略
比如:@OneToMany(fetch=FetchType.LAZY)
測試一對多刪除方法
新建單元測試方法
?@Testpublic void testOneToManyRemove(){Customer customer = entityManager.find(Customer.class, 8);entityManager.remove(customer);}注:
默認情況下, 若刪除 1 的一端, 則會先把關聯(lián)的 n 的一端的外鍵置空,然后進行刪除。
可以通過 @OneToMany 的 cascade屬性來修改默認的刪除策略。
比如:@OneToMany(fetch=FetchType.LAZY,cascade={CascadeType.REMOVE})
測試一對多更新方法
新建單元測試方法
??@Testpublic void testUpdate(){Customer customer = entityManager.find(Customer.class, 6);customer.getOrders().iterator().next().setOrderName("O-XXX-10");}?
總結
以上是生活随笔為你收集整理的JPA中实现单向一对多的关联关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JPA中实现单向多对一的关联关系
- 下一篇: JPA中实现双向一对多的关联关系