博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JPA关系映射系列二:one-to-one主键关联
阅读量:6983 次
发布时间:2019-06-27

本文共 5899 字,大约阅读时间需要 19 分钟。

hot3.png

SpringDataJPA是Spring Data的一个子项目,通过提供基于JPA的Repository极大的减少了JPA作为数据访问方案的代码量,你仅仅需要编写一个接口集成下SpringDataJPA内部定义的接口即可完成简单的CRUD操作。

前言

本篇文章引导你通过Spring BootSpring Data JPAMySQL实现一对一主键关联映射。

准备

  • JDK 1.8 或更高版本
  • Maven 3 或更高版本
  • MySQL Server 5.6

技术栈

  • Spring Data JPA
  • Spring Boot
  • MySQL

目录结构

父pom.xml

4.0.0
cn.merryyou
jpa-example
1.0-SNAPSHOT
one-to-one-foreignkey
one-to-one-primarykey
one-to-many
many-to-many
many-to-many-extra-columns
pom
io.spring.platform
platform-bom
Brussels-SR6
pom
import

一对一主键

目录结构

pom.xml
jpa-example
cn.merryyou
1.0-SNAPSHOT
4.0.0
one-to-one-primarykey
UTF-8
1.8
org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
runtime
org.projectlombok
lombok
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
org.apache.maven.plugins
maven-compiler-plugin
3.6.1
1.8
1.8
一对一主键关联

book.idbook_detail.book_id

db.sql

CREATE DATABASE  IF NOT EXISTS `jpa_onetoone_primarykey`;USE `jpa_onetoone_primarykey`;---- Table structure for table `book_detail`--DROP TABLE IF EXISTS `book`;CREATE TABLE `book` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;---- Table structure for table `book`--DROP TABLE IF EXISTS `book_detail`;CREATE TABLE `book_detail` (`book_id` int(11) unsigned NOT NULL,`number_of_pages` int(11) DEFAULT NULL,PRIMARY KEY (`book_id`),CONSTRAINT `fk_bookdetail_bookid` FOREIGN KEY (`book_id`) REFERENCES `book` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;
实体类
Book
@Entity@Datapublic class Book implements Serializable {    @Id    @GeneratedValue(strategy = GenerationType.AUTO)    private int id;    private String name;    @OneToOne(cascade = CascadeType.ALL, mappedBy = "book")    private BookDetail bookDetail;    public Book() {    }    public Book(String name) {        this.name = name;    }    public Book(String name, BookDetail bookDetail) {        this.name = name;        this.bookDetail = bookDetail;        this.bookDetail.setBook(this);    }    @Override    public String toString() {        return String.format(                "Book[id=%d, name='%s', number of pages='%d']",                id, name, bookDetail.getNumberOfPages());    }}
BookDetail
@Entity@Table(name = "book_detail")@Datapublic class BookDetail implements Serializable {    @Id    @OneToOne    @JoinColumn(name = "book_id")    private Book book;    @Column(name = "number_of_pages")    private Integer numberOfPages;    public BookDetail() {    }    public BookDetail(Integer numberOfPages) {        this.numberOfPages = numberOfPages;    }}
  • @Table声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe),目录(Catalog)和schema的名字。该注释不是必须的,如果没有则系统使用默认值(实体的短类名)。

  • @Id 声明此属性为主键。该属性值可以通过应该自身创建,但是Hibernate推荐通过Hibernate生成

  • @GeneratedValue 指定主键的生成策略。

    1. TABLE:使用表保存id值
    2. IDENTITY:identitycolumn
    3. SEQUENCR :sequence
    4. AUTO:根据数据库的不同使用上面三个
  • @Column 声明该属性与数据库字段的映射关系。

  • @OneToOne 一对一关联关系

  • @JoinColumn 指定关联的字段

Spring Data JPA Repository
public interface BookRepository extends JpaRepository
{}

Spring Data JPA包含了一些内置的Repository,实现了一些常用的方法:findonefindallsave等。

application.yml
spring:  datasource:    url: jdbc:mysql://localhost/jpa_onetoone_primarykey    username: root    password: admin    driver-class-name: com.mysql.jdbc.Driver  jpa:    show-sql: true
BookRepositoryTest
@RunWith(SpringRunner.class)@SpringBootTest()@Slf4jpublic class BookRepositoryTest {    @Autowired    private BookRepository bookRepository;    @Test    public void saveTestPrimaryKey() throws Exception {        List
books = new ArrayList<>(); books.add(new Book("Book one", new BookDetail(1))); books.add(new Book("Book two", new BookDetail(2))); books.add(new Book("Book three", new BookDetail(3))); bookRepository.save(books); } @Test public void findBooksTestPrimaryKey() throws Exception{ List
books = bookRepository.findAll(); for (Book book: books) { log.info(book.toString()); } }}

代码下载

从我的 github 中下载,


???关注微信小程序java架构师历程 上下班的路上无聊吗?还在看小说、新闻吗?不知道怎样提高自己的技术吗?来吧这里有你需要的java架构文章,1.5w+的java工程师都在看,你还在等什么?

转载于:https://my.oschina.net/merryyou/blog/1626798

你可能感兴趣的文章
C#解压缩文件
查看>>
Golang学习笔记——Slice
查看>>
ERDAS软件应用(三)遥感图像的拼接
查看>>
在面试中如何展示虚拟机和内存调优技能
查看>>
hdu 1534 Schedule Problem (差分约束)
查看>>
HDU1159 Common Subsequence【最长公共子序列】
查看>>
C++ 字符数组函数与string函数
查看>>
无限极分类优化方式
查看>>
从运维的角度理解Iaas、Paas、Saas云计算
查看>>
使用动画播放文件夹中的图片
查看>>
logging模块
查看>>
C# 将string 转换为二维码图片,然后转为base64字符串编码 。
查看>>
软件工程概论03
查看>>
js截取最后一个斜杠之后的内容
查看>>
Java程序安装失败
查看>>
解决网络请求的依赖关系
查看>>
设计模式(4)建造者模式/生成器模式(Builder)
查看>>
hdu 1036 (I/O routines, fgets, sscanf, %02d, rounding, atoi, strtol) ...
查看>>
开闭原则
查看>>
Silverlight 4常用StringFormat格式总结
查看>>