JPA关系映射系列一:one-to-one外键关联
2019獨角獸企業重金招聘Python工程師標準>>>
SpringDataJPA是Spring Data的一個子項目,通過提供基于JPA的Repository極大的減少了JPA作為數據訪問方案的代碼量,你僅僅需要編寫一個接口集成下SpringDataJPA內部定義的接口即可完成簡單的CRUD操作。
前言
本篇文章引導你通過Spring Boot,Spring Data JPA和MySQL實現一對一外鍵關聯映射。
準備
- JDK 1.8 或更高版本
- Maven 3 或更高版本
- MySQL Server 5.6
技術棧
- Spring Data JPA
- Spring Boot
- MySQL
目錄結構
父pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.merryyou</groupId><artifactId>jpa-example</artifactId><version>1.0-SNAPSHOT</version><modules><module>one-to-one-foreignkey</module><module>one-to-one-primarykey</module><module>one-to-many</module><module>many-to-many</module><module>many-to-many-extra-columns</module></modules><packaging>pom</packaging><dependencyManagement><dependencies><dependency><groupId>io.spring.platform</groupId><artifactId>platform-bom</artifactId><version>Brussels-SR6</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement> </project>一對一外鍵
目錄結構
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>jpa-example</artifactId><groupId>cn.merryyou</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>one-to-one-foreignkey</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.6.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build> </project>一對一關系
book.book_detail_id 和 book_detail.id
db.sql
CREATE DATABASE IF NOT EXISTS `jpa_onetoone_foreignkey`; USE `jpa_onetoone_foreignkey`;-- -- Table structure for table `book_detail` --DROP TABLE IF EXISTS `book_detail`; CREATE TABLE `book_detail` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `number_of_pages` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;-- -- Table structure for table `book` --DROP TABLE IF EXISTS `book`; CREATE TABLE `book` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `book_detail_id` int(11) unsigned DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_book_bookdetail` (`book_detail_id`), CONSTRAINT `fk_book_bookdetail` FOREIGN KEY (`book_detail_id`) REFERENCES `book_detail` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;實體類
Book
@Entity @Data @Table(name = "book") public class Book {@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id")private int id;@Column(name = "name")private String name;@OneToOne(cascade = CascadeType.ALL)@JoinColumn(name = "book_detail_id") // @Lazy(false)private BookDetail bookDetail;public Book() {}public Book(String name, BookDetail bookDetail) {this.name = name;this.bookDetail = bookDetail;} }BookDetail
@Entity @Table(name = "book_detail") @Data public class BookDetail {@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id")private Integer id;@Column(name = "number_of_pages")private Integer numberOfPages;@OneToOne(mappedBy = "bookDetail")private Book book;public BookDetail() {}public BookDetail(Integer numberOfPages) {this.numberOfPages = numberOfPages;} }-
@Table聲明此對象映射到數據庫的數據表,通過它可以為實體指定表(talbe),目錄(Catalog)和schema的名字。該注釋不是必須的,如果沒有則系統使用默認值(實體的短類名)。
-
@Id 聲明此屬性為主鍵。該屬性值可以通過應該自身創建,但是Hibernate推薦通過Hibernate生成
-
@GeneratedValue 指定主鍵的生成策略。
- TABLE:使用表保存id值
- IDENTITY:identitycolumn
- SEQUENCR :sequence
- AUTO:根據數據庫的不同使用上面三個
-
@Column 聲明該屬性與數據庫字段的映射關系。
-
@OneToOne 一對一關聯關系
-
@JoinColumn 指定關聯的字段
Spring Data JPA Repository
public interface BookRepository extends JpaRepository<Book, Integer> { }Spring Data JPA包含了一些內置的Repository,實現了一些常用的方法:findone,findall,save等。
application.yml
spring:datasource:url: jdbc:mysql://localhost/jpa_onetoone_foreignkeyusername: rootpassword: admindriver-class-name: com.mysql.jdbc.Driverjpa:show-sql: trueBookRepositoryTest
@RunWith(SpringRunner.class) @SpringBootTest @Slf4j public class BookRepositoryTest {@Autowiredprivate BookRepository bookRepository;@Testpublic void saveTest() throws Exception {List<Book> 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)));List<Book> bookList = bookRepository.save(books);Assert.assertNotNull(bookList);Assert.assertEquals(3, bookList.size());}@Testpublic void findBooksTest() throws Exception{List<Book> books = bookRepository.findAll();for (Book book: books) {log.info(book.toString());}}}代碼下載
從我的 github 中下載,https://github.com/longfeizheng/jpa-example/tree/master/one-to-one-foreignkey
???關注微信小程序java架構師歷程 上下班的路上無聊嗎?還在看小說、新聞嗎?不知道怎樣提高自己的技術嗎?來吧這里有你需要的java架構文章,1.5w+的java工程師都在看,你還在等什么?
轉載于:https://my.oschina.net/merryyou/blog/1626381
總結
以上是生活随笔為你收集整理的JPA关系映射系列一:one-to-one外键关联的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SocialFish-kali下社会工程
- 下一篇: iPhone设备分辨率及尺寸