/**

  • @author StormMaybin
  • @date 2017-01-17

    */

生命不息,奋斗不止!


一对多映射关系

在JPA中,用@OneToMany来标识一对多的关系。实现一对多的单向关联,只需在代表一的实体(Company)中使用@OneToMany映射标注就可以了,代表多的实体不需要使用任何映射标注。

有两种方式实现一对多的单向关联。一种是在只使用@OneToMany来标识,这种方式是通过一张第三方表来保存关系。还有一种是使用@OneToMany和@JoinColumn来标注,这种方式是在多的一方(Employee)的表中增加一个外键列来保存关系。

OneToMany

Company.java

package com.stormma.model;

import java.util.List;

import javax.persistence.CascadeType;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.OneToMany;

import javax.persistence.Table; /**
  • Created by mayongbin01 on 2017/1/17.

    */

    @Entity

    @Table(name = "company")

    public class Company { //唯一标识公司

    @Id

    @GeneratedValue

    private int id; //公司名字

    private String name; @OneToMany(cascade = {CascadeType.ALL})

    private List<Employee> employees; public int getId() {

    return id;

    } public void setId(int id) {

    this.id = id;

    } public String getName() {

    return name;

    } public void setName(String name) {

    this.name = name;

    }

    }

Employee.java

package com.stormma.model;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.Table; /**
  • Created by mayongbin01 on 2017/1/17.

    */

    @Entity

    @Table(name = "employee")

    public class Employee { //唯一标识雇员

    @Id

    @GeneratedValue

    private int id; private String name; public int getId() {

    return id;

    } public void setId(int id) {

    this.id = id;

    } public String getName() {

    return name;

    } public void setName(String name) {

    this.name = name;

    }

    }

生成的表结构

CREATE TABLE `employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS company;

CREATE TABLE company (

id int(11) NOT NULL AUTO_INCREMENT,

name varchar(255) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS company_employees;

CREATE TABLE company_employees (

company_id int(11) NOT NULL,

employees_id int(11) NOT NULL,

UNIQUE KEY UK_lg2r1rg13q18sa62l1y7un4or (employees_id),

KEY FKd66w6jx84tydyd8sf9mpqh5je (company_id),

CONSTRAINT FKd66w6jx84tydyd8sf9mpqh5je FOREIGN KEY (company_id) REFERENCES company (id),

CONSTRAINT FKnntnqhhla66c4h9ddbnlvqk2x FOREIGN KEY (employees_id) REFERENCES employee (id)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

OneToMany+JoinColumn

Company.java

package com.stormma.model;

import java.util.List;

import javax.persistence.CascadeType;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.OneToMany;

import javax.persistence.Table; /**
  • Created by mayongbin01 on 2017/1/17.

    */

    @Entity

    @Table(name = "company")

    public class Company { //唯一标识公司

    @Id

    @GeneratedValue

    private int id; //公司名字

    private String name; @OneToMany(cascade = CascadeType.ALL)

    @JoinColumn(name = "company_id")

    private List<Employee> employees; public int getId() {

    return id;

    } public void setId(int id) {

    this.id = id;

    } public String getName() {

    return name;

    } public void setName(String name) {

    this.name = name;

    }

    }

Employee.java

package com.stormma.model;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.Table; /**
  • Created by mayongbin01 on 2017/1/17.

    */

    @Entity

    @Table(name = "employee")

    public class Employee { //唯一标识雇员

    @Id

    @GeneratedValue

    private int id; private String name; public int getId() {

    return id;

    } public void setId(int id) {

    this.id = id;

    } public String getName() {

    return name;

    } public void setName(String name) {

    this.name = name;

    }

    }

结构

Hibernate: create table company (id integer not null auto_increment, name varchar(255), primary key (id))
Hibernate: create table employee (id integer not null auto_increment, name varchar(255), company_id integer, primary key (id))
Hibernate: alter table employee add constraint FK5v50ed2bjh60n1gc7ifuxmgf4 foreign key (company_id) references company (id)

原文地址:https://www.jianshu.com/p/0a2163273b3e

Spring Data Jpa一对多单向映射的更多相关文章

  1. spring data jpa 一对多查询

    在一对多关系中,我们习惯把一的一方称之为主表,把多的一方称之为从表.在数据库中建立一对多的关系,需要使用数据库的外键约束. 什么是外键? 指的是从表中有一列,取值参照主表的主键,这一列就是外键. pa ...

  2. spring data jpa自定义bean字段映射

    当遇到复杂多表查询时,并且同时还需要确保查询性能,此时则需要使用自定义sql查询,然而spring data jpa对于自定义sql则需使用查询需要在对应的bean中做太多的配置映射,我尝试了一下,最 ...

  3. spring data jpa 操作pipelinedb 的continuous view 与stream

    一. 由于pipelinedb是postgreSQL的扩展,因此相关依赖于配置都合集成postgreSQL是一样的. springboot + spring data jpa + postgreSQL ...

  4. Spring Data JPA 学习记录1 -- 单向1:N关联的一些问题

    开新坑 开新坑了(笑)....公司项目使用的是Spring Data JPA做持久化框架....学习了一段时间以后发现了一点值得注意的小问题.....与大家分享 主要是针对1:N单向关联产生的一系列问 ...

  5. spring data jpa使用 (转:http://www.manongjc.com/article/25284.html#four_1_7)

    Jap相关的使用 时间:2018-12-18 本文章向大家介绍Jap相关的使用,主要包括Jap相关的使用使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下. ...

  6. Spring Data JPA 初体验

    一,JPA相关的概念 JPA概述 全称是:JavaPersistence API.是SUN公司推出的一套基于ORM的规范. Hibernate框架中提供了JPA的实现. JPA通过JDK 5.0注解或 ...

  7. Spring data JPA中使用Specifications动态构建查询

    有时我们在查询某个实体的时候,给定的条件是不固定的,这是我们就需要动态 构建相应的查询语句,在JPA2.0中我们可以通过Criteria接口查询,JPA criteria查询.相比JPQL,其优势是类 ...

  8. Spring Data JPA实体详解

    1. Spring Data JPA实体概述 JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系数据库的映射,此类Java对象称为JPA实体或简称实体.实体通常与底层数据库中的单个关系 ...

  9. Spring Boot + Spring Data JPA + PostgreSQL

    最近在用Java重写之前实习生用.netcore写的微信后台应用. 规定用Spring Boot框架,PostgreSQL数据库.之前一直习惯于基于XML的Spring app,也没用过Postgre ...

随机推荐

  1. FZU 1575 小学生的游戏【模拟二分】

    某天,无聊的小斌叫上几个同学玩游戏,其中有比较笨的小兴,比较傻的小雪,可爱的小霞和自以为是的小楠.他们去找聪明的小明去给他们当裁判.判定谁取得游戏胜利. 而这个游戏是由小斌想个1到10000000的数 ...

  2. 写GULP遇到的ES6问题详解

    Gulp.js 是一个自动化构建工具,开发者可以使用它在项目开发过程中自动执行常见任务.最近复习一下gulp一些基本的写法,在写了一些简单的uglify,rename,concat,clean的处理之 ...

  3. php封装的smarty类实例是怎样

    * @link http://www.smarty.net/* @copyright 2008 New Digital Group, Inc.* @author Monte Ohrt <mont ...

  4. sping,springMVC @Component 注解的对象都是单例模式,变量不能全局

    错误方式:      将属性和变量定义为全局,单例模式,所有人共享,导致所有人的数据都发生错误! 正确方式 一:    将变量定义到局部,互不影响. 正确方式 二:      假如必须放到全局所有方法 ...

  5. 仿Google Nexus菜单样式

    在线演示 本地下载

  6. 利用UIWebView打造一个炫酷的视频背景视图(OC & Swift)

    http://www.cocoachina.com/ios/20151023/13860.html 2015-10-6更新:适配 Swift2.0 如有需要,可以通过pjin.elvin@gmail. ...

  7. PLAY2.6-SCALA(四) 请求体解析器

    一个http请求是一个请求头后面跟着一个请求体,头部信息比较短,可以安全的缓存在内存中,在Play中头部信息使用RequestHeader类进行建模.请求体的内容可能较大,使用流stream的形式进行 ...

  8. 为什么printf()用%f输出double型,而scanf却用%lf呢?

    之前没有注意过这个问题,  转自: http://book.51cto.com/art/200901/106880.htm 问:有人告诉我不能在printf中使用%lf.为什么printf()用%f输 ...

  9. mariadb配置文件优化参数

    mariadb数据库优化需要根据自己业务需求以及根据硬件配置来进行参数优化,下面是一些关于mariadb数据库参数优化的配置文件. 1 如下为128G内存32线程处理器的mariadb配置参数优化: ...

  10. Chrome的使用技巧总结

    设置一>” 首先设置打开特定的网页 设置--> “下载位置” (Ctrl+H),快速查找自己浏览器访问网页的历史记录 (Ctrl+D),将目前认为比较好的网页保存. ctrl+t  新建标 ...