1. 程式人生 > >JPA 菜鳥教程 3 單向多對一

JPA 菜鳥教程 3 單向多對一

GitHub

JPA中的@ManyToOne

主要屬性
- name(必需): 設定“many”方所包含的“one”方所對應的持久化類的屬性名
- column(可選): 設定one方的主鍵,即持久化類的屬性對應的表的外來鍵
- class(可選): 設定one方對應的持久化類的名稱,即持久化類屬性的型別
- not-null(可選): 如果為true,,表示需要建立相互關聯的兩個表之間的外來鍵約束
- cascade(可選): 級聯操作選項,預設為none

單向多對一(@ManyToOne)關聯是最常見的單向關聯關係。假設多種商品(Product)可以有一個商品型別(ProductType),只關心商品(Product)實體找到對應的商品型別(ProductType)實體,而無須關心從某個商品型別(ProductType)找到全部商品(Product).

單向多對一表的ddl語句

CREATE TABLE `t_product_type` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

CREATE TABLE `t_product` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT
NULL, `type_id` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `FK_oyt6r2g6hwbyee5adel4yj59e` (`type_id`), CONSTRAINT `FK_oyt6r2g6hwbyee5adel4yj59e` FOREIGN KEY (`type_id`) REFERENCES `t_product_type` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

Product

package com.jege.jpa.many2one;

import
javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; /** * @author JE哥 * @email [email protected] * @description:單向:多個產品屬於同一個產品型別 */ @Entity @Table(name = "t_product") public class Product { @Id @GeneratedValue private Long id; private String name; // 多對一:optional=false表示外來鍵type_id不能為空 @ManyToOne(optional = true) @JoinColumn(name = "type_id") private ProductType type; public Product() { } public Product(String name, ProductType type) { this.name = name; this.type = type; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public ProductType getType() { return type; } public void setType(ProductType type) { this.type = type; } @Override public String toString() { return "Product [id=" + id + ", name=" + name + "]"; } }

ProductType

package com.jege.jpa.many2one;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * @author JE哥
 * @email [email protected]
 * @description:單向
 */
@Entity
@Table(name = "t_product_type")
public class ProductType {
  @Id
  @GeneratedValue
  private Long id;
  private String name;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @Override
  public String toString() {
    return "ProductType [id=" + id + ", name=" + name + "]";
  }

}

Many2OneTest

package com.jege.jpa.many2one;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
 * @author JE哥
 * @email [email protected]
 * @description:單向多對一Test
 */
public class Many2OneTest {
  private static EntityManagerFactory entityManagerFactory = null;
  private EntityManager entityManager = null;

  @BeforeClass
  public static void setUpBeforeClass() throws Exception {
    entityManagerFactory = Persistence.createEntityManagerFactory("com.jege.jpa");
  }

  // 要求:一次性儲存1個產品型別,儲存2個產品
  // 單向多對一儲存的時候必須先儲存一方,否則會出現多餘的update語句,從而影響效能
  @Before
  public void persist() throws Exception {
    entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();

    ProductType type = new ProductType();
    type.setName("產品型別1");

    // 傳入type的本質是處理資料庫product表的type_id外來鍵
    Product product1 = new Product("產品1", null);
    Product product2 = new Product("產品2", type);

    System.out.println("儲存之前:" + type);
    entityManager.persist(type);// JPA會自動把儲存後的主鍵放到當前物件的id裡面
    System.out.println("儲存之後:" + type);
    entityManager.persist(product1);
    entityManager.persist(product2);
    System.out.println("++++++++++++++++++++");
  }

  // 可以通過多方Product獲取一方ProductType是否為null,來判斷是否有產品型別
  @Test
  public void find() throws Exception {
    Product product = entityManager.find(Product.class, 2L);
    System.out.println(product);
    ProductType type = product.getType();
    if (type == null) {
      System.out.println("當前產品是沒有產品型別的");
    } else {
      System.out.println("當前產品是有產品型別的");
    }
  }

  @After
  public void tearDown() throws Exception {
    entityManager.getTransaction().commit();
    if (entityManager != null && entityManager.isOpen())
      entityManager.close();
  }

  @AfterClass
  public static void tearDownAfterClass() throws Exception {
    if (entityManagerFactory != null && entityManagerFactory.isOpen())
      entityManagerFactory.close();
  }

}

其他關聯專案

原始碼地址

如果覺得我的文章或者程式碼對您有幫助,可以請我喝杯咖啡。
您的支援將鼓勵我繼續創作!謝謝!
微信打賞
支付寶打賞

相關推薦

JPA 教程 3 單向

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

JPA 教程 6 單向

GitHub JPA中的@ManyToMany @ManyToMany註釋表示模型類是多對多關係的一端。 @JoinTable 描述了多對多關係的資料表關係。 name 屬性指定中間表名稱 joinColumns 定義中間表與Teach

JPA 教程 15 繼承-一個表-SINGLE_TABLE

column turn rate pre school fill 技術 一個表 tor 原地址:http://blog.csdn.net/JE_GE/article/details/53678422 繼承映射策略 一個類繼承結構一個表的策略,最終只生成一個表,這是繼承映射的

Java 8 新特性-教程 (3) -Java 8 函數式接口

但是 style vax arr 結果 友好 face todo 兩個 Java 8 函數式接口 函數式接口(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。 函數式接口可以被隱式轉換為lambda表達式。 函數式接口

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

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

JPA:對映單向關聯關係

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

JPA 教程 19 jpa uuid主鍵生成策略

GitHub ddl語句 CREATE TABLE `t_user` ( `id` varchar(32) NOT NULL, `name` varchar(255) DEFAU

jpa--9.單向

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

JPA 教程 2 單表操作

GitHub JPA Sun官方提出的Java持久化規範。它為Java開發人員提供了一種物件/關係對映工具來管理Java應用中的關係資料。他的出現主要是為了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate、TopLink等OR

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 找到 基礎 什麽是一對多,多對一?雙向多對一和雙向一對多是不是同一個概念?   是一個概念,雙向多對一和雙向一對多都是配置一個 一對多和多對一   一對多,比如你去找一個父親的所有孩子,孩子可能有兩個,三個

[學習筆記]教程Swift知識點總結(

目錄基本語法資料型別變數、常量可選型別字面量運算子 基本語法 Swift 的多行註釋可以巢狀在其他多行註釋內部。寫法是在一個多行註釋塊內插入另一個多行註釋。第二個註釋塊封閉時,後面仍然接著第一個註釋塊

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

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

JPA單向關聯

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

【Dubbo教程3、dubbo監控中心的搭建

dubbo監控中心就是dubbo提供給我們的一個web管理平臺,到官方下載dubbo-admin下載部署到本地tomcat,訪問路徑即可搭建成功 1、下載dubbo-admin到本地

Spring Boot 教程 28 配置檔案

GitHub 需求產生 開發過程中可能會有如下需求:開發和部署的配置資訊可能不同,常規的方式就是在配置檔案裡面先寫好開發配置,在部署的時候再去修改這些配置,這樣可能會出現很多問題,比如使用者名稱、密碼忘記了修改或者改錯了等問題。 專案結構圖片

hibernate之單向關聯

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