1. 程式人生 > >jpa--9.單向多對一

jpa--9.單向多對一

1      單向多對一

1.1  概念

只有一方維護

1.2  配置

一個訂單隻有一個使用者,一個使用者多個訂單

   使用 @ManyToOne來對映多對一的關聯關係, fetch屬性來修改預設的關聯屬性的載入策略

   使用 @JoinColumn來對映外來鍵.

   @JoinColumn(name="CUSTOMER_ID")

   @ManyToOne(fetch=FetchType.LAZY)

1.3  資料生成資訊

Order表會產生外來鍵

 

1.4  測試準備

1.4.1  Customer

@Table(name="JPA_CUTOMERS")
@Entity
public classCustomer {
  
   private Integer id;
   private String lastName;
 
   private String email;
   private int age;
  
   private Date createdTime;
   private Date birth;
  
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Id
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
  
   @Column(name = "last_name",length = 50, nullable = false)
   public String getLastName() {
      return lastName;
   }
   public void setLastName(String lastName) {
      this.lastName = lastName;
   }
   public String getEmail() {
      return email;
   }
   public void setEmail(String email) {
      this.email = email;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
  
   @Temporal(TemporalType.TIMESTAMP)
   public Date getCreatedTime() {
      return createdTime;
   }
   public void setCreatedTime(Date createdTime) {
      this.createdTime = createdTime;
   }
   @Temporal(TemporalType.DATE)
   public Date getBirth() {
      return birth;
   }
   public void setBirth(Date birth) {
      this.birth = birth;
   }
}

1.4.2  Order

@Table(name="JPA_ORDERS")
@Entity
public classOrder {
 
   private Integer id;
   private String orderName;
 
   private Customer customer;
 
   @GeneratedValue
   @Id
   public 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 的關聯關係
   //使用 @ManyToOne 來對映多對一的關聯關係, fetch 屬性來修改預設的關聯屬性的載入策略
   //使用 @JoinColumn來對映外來鍵.
   @JoinColumn(name="CUSTOMER_ID")
   @ManyToOne(fetch=FetchType.LAZY)
   public Customer getCustomer(){
      return customer;
   }
 
   public void setCustomer(Customer customer) {
      this.customer = customer;
   }
 
} 

1.4.3  準備JPATest

public classJPATest {
 
   private EntityManagerFactory entityManagerFactory;
   private EntityManager entityManager;
   private EntityTransaction transaction;
  
   @Before
   public void init(){
      entityManagerFactory= Persistence.createEntityManagerFactory("jpa_test1");
      entityManager = entityManagerFactory.createEntityManager();
      transaction = entityManager.getTransaction();
      transaction.begin();
   }
  
   @After
   public void destroy(){
      transaction.commit();
      entityManager.close();
      entityManagerFactory.close();
   }
  
}

2      操作

2.1  儲存

建議先儲存一的一方,再儲存多的一方,就不會出現update語句

2.1.1  測試先多再一

先儲存一的一端,再儲存多的一端

/**
    * 儲存多對一時, 建議先儲存 1 的一端, 後儲存 n 的一端, 這樣不會多出額外的 UPDATE 語句.
    */
   @Test
   public void testManyToOnePersist(){
      Customercustomer= newCustomer();
      customer.setAge(18);
      customer.setBirth(new Date());
      customer.setCreatedTime(new Date());
      customer.setEmail("[email protected]");
      customer.setLastName("GG");
     
      Orderorder1= newOrder();
      order1.setOrderName("G-GG-1");
      Orderorder2= newOrder();
      order2.setOrderName("G-GG-2");
     
      //設定關聯關係
      order1.setCustomer(customer);
      order2.setCustomer(customer);
     
      //執行儲存操作
      entityManager.persist(order1);
      entityManager.persist(order2);
     
      entityManager.persist(customer);
   }

2.1.2  測試先一再多

/**
    * 儲存多對一時, 建議先儲存 1 的一端, 後儲存 n 的一端, 這樣不會多出額外的 UPDATE 語句.
    */
   @Test
   public void testManyToOnePersist2(){
      Customercustomer= newCustomer();
      customer.setAge(18);
      customer.setBirth(new Date());
      customer.setCreatedTime(new Date());
      customer.setEmail("[email protected]");
      customer.setLastName("GG");
     
      Orderorder1= newOrder();
      order1.setOrderName("G-GG-1");
      Orderorder2= newOrder();
      order2.setOrderName("G-GG-2");
     
      //設定關聯關係
      order1.setCustomer(customer);
      order2.setCustomer(customer);
     
      //執行儲存操作(先一再多)
      entityManager.persist(customer);
     
      entityManager.persist(order1);
      entityManager.persist(order2);
     
   }

 

2.2  查詢(oid)

2.2.1  預設載入

查詢多方

//預設情況下, 使用左外連線的方式來獲取 n 的一端的物件和其關聯的 1 的一端的物件.
   //可使用 @ManyToOne 的 fetch 屬性來修改預設的關聯屬性的載入策略
   @Test
   public void testManyToOneFind(){
      Orderorder= entityManager.find(Order.class, 1);
      System.out.println(order.getOrderName());
 
      System.out.println(order.getCustomer().getLastName());
   }

2.2.2  懶載入

懶載入:當呼叫時,才傳送查詢sql語句

2.3  刪除(多方)

只能刪除多的一方

 //不能直接刪除 1 的一端, 因為有外來鍵約束.
   @Test
   public void testManyToOneRemove(){
 
      Orderorder= entityManager.find(Order.class, 1);
      entityManager.remove(order);
     
//    不能刪除1的一方
//    Customercustomer = entityManager.find(Customer.class, 1);
//    entityManager.remove(customer);
   }

2.4  更新

只要是針對多方,一方就直接單表了

@Test

   public void testManyToOneUpdate(){

      Orderorder= entityManager.find(Order.class, 2);

      order.getCustomer().setLastName("FFF");

   }

 

原始碼:https://download.csdn.net/download/qq_26553781/10320230

相關推薦

jpa--9.單向

1      單向多對一1.1  概念只有一方維護1.2  配置一個訂單隻有一個使用者,一個使用者多個訂單   使用 @ManyToOne來對映多對一的關聯關係, fetch屬性來修改預設的關聯屬性的載入策略   使用 @JoinColumn來對映外來鍵.    @JoinC

JPA:對映單向關聯關係

1.單向多對一是jpa中常用的關聯關係,這裡以訂單和顧客舉例子(多個訂單可以對應同一顧客) 2.顧客實體類程式碼如下: package com.wayne.helloworld; import java.util.Date; import javax.persistence.Colu

JPA(五):映射關聯關系------映射單向的關聯關系

span AS 127.0.0.1 mysql5 單向 cti isa 嘗試 sequence 映射單向多對一的關聯關系 新建Customer.java: package com.dx.jpa.singlemanytoone; import java.ut

JPA 菜鳥教程 3 單向

GitHub JPA中的@ManyToOne 主要屬性 - name(必需): 設定“many”方所包含的“one”方所對應的持久化類的屬性名 - column(可選): 設定one方的主鍵,即持久化類的屬性對應的表的外來鍵 - class

Hibernate單向”關聯

額外 generator nat col 方式 單向 key null option 1. 基於外鍵關聯的單向“多對一”關聯是最常見的單向關聯其中指定many-to-one的unique="true",為單向“一對一”,不指定就是單向“多對一” <class name

(十二)Hibernate中的表操作(1):單向

art 保存 int gen round t對象 情況 映射文件 拋出異常 由“多”方可知“一”方的信息,比如多個員工使用同一棟公寓,員工可以知道公寓的信息,而公寓無法知道員工的信息。 案例一: pojo類 public class Department {

Hibernate單向映射關系(1)

關聯 hbm.xml factor ngs actor cnblogs conf ima 一個 單向 n-1 單向 n-1 關聯只需從 n 的一端可以訪問 1 的一端 域模型: 從 Order 到 Customer 的多對一單向關聯需要在Order 類中定義一個 Custo

Mybatis單向

ron itl private list url html -- nta 編寫 一、假定一個父母有多個孩子,那父母和孩子對應關系為1對多。 二、 1、添加依賴包,參考上篇文章 Mybatis+mysql入門使用 2、初始化數據庫和初始數據,以mysql為例

hibernate中配置單向關聯,和雙向一對

findstr man dea exc prop imp pri 找到 基礎 什麽是一對多,多對一?雙向多對一和雙向一對多是不是同一個概念?   是一個概念,雙向多對一和雙向一對多都是配置一個 一對多和多對一   一對多,比如你去找一個父親的所有孩子,孩子可能有兩個,三個

Hibernate 單向單向一對、雙向一對關聯關係詳解

一對多關係是最普遍的對映關係。比如部門和職工 一對多:從部門的角度,一個部門對應多個職工 多對一:從職工的角度,多個職工對應一個部門 資料庫表中結構: 表 department:did departname 表 Employee:eid   en

JPA單向關聯

單向關聯 com 使用 gpo false jpa log post 關聯 在實際開發過程中,JPA多對一單向關聯是使用最多的關聯方式。 下面是訂單與訂單項的配置關系。 訂單(Order):一的一方,不進行任何配置 @Entity @Table(name

hibernate5(9)註解對映[1]單向關聯

在部落格網站中,我們可能需要從某一篇文章找到其所關聯的作者,這就需要從文章方建立起對使用者的關聯,即是多對一的對映關係。 現在先看一個配置例項:我們的文章實體類 package com.zeng.model; import javax.persistenc

hibernate之單向關聯

als exce 方法 試用 size code 產生 配置文件 sse 一個工作組(Group)裏能夠有多個用戶(User),一個User僅僅屬於一個Group,這是典型的多對一的關系。在多對一的關系中正確的數據庫設計是在多的這方(在這裏是User這方

口吃掉Hibernate(四)——單向關聯映射

mark frame 自動 exce itl format 表之間 cfg.xml pda hibernate對於數據庫的操作,全部利用面向對象的思維來理解和實現的。一般的單獨表的映射,相信大家都沒有問題,但是對於一些表之間的特殊關系,Hibernate提供了一些獨特的方式

Hibernate,關係對映的單向關聯、雙向關聯、一對一主鍵關聯、一對一外來鍵關聯、關係關聯

2018-11-10  22:27:02開始寫   下圖內容ORM、Hibernate介紹、hibername.cfg.xml結構:     下圖內容hibernate對映檔案結構介紹   下圖內容hibernate

Hibernate,關系映射的單向關聯、雙向關聯、一對一主鍵關聯、一對一外鍵關聯、關系關聯

nat 延遲加載 alt ima orm 雙向關聯 映射文件 結構 spa 2018-11-10 22:27:02開始寫 下圖內容ORM、Hibernate介紹、hibername.cfg.xml結構: 下圖內容hibernate映射文件結構介紹

JPA表關聯關係(、一對、一對一)

小提示:外來鍵在哪邊,那邊就是多方哦!! 單向多對一:   給多方加上 @ManyToOne ex:【產品類Product--多方 ,產品分類ProductDir--一方】 單向一對多:給一方加上 @OneToMany ex

Hibernate配置單向一對,出現 org.hibernate.MappingException: Repeated column in mapping for entity5

報錯情況就是這樣,網上一般情況是說的 使用的Hibernate實體類對映資料庫時 配置對應 對映時出現了重複情況** should be mapped with insert=“false” update=“false”) 主要是因為 資料庫裡面的欄位只能對映到

口吃掉Hibernate(四)——單向關聯對映

【轉自 http://blog.csdn.net/xiaoxian8023 】 https://blog.csdn.net/xiaoxian8023/article/details/12249889 可能有人會對這2篇部落格的題目有點混淆不清,跟日常說的關係有點不同。我們

[增刪改查] 最規範的 JPA 一對/ CRUD 示例

一、前言 1、多對一,一對多,都是一樣的,反過來了而已。 2、之前寫過一篇不使用主外來鍵關係的多表 CRUD: [增刪改查] 最簡單的 JPA 一對多/多對一 CRUD 設計 雖可以幫助新手快速使用 JPA,但是這樣是不嚴謹的,特別是記錄的刪除,有了主