JPA關(guān)系映射系列一:one-to-one外鍵關(guān)聯(lián)

SpringDataJPA是Spring Data的一個子項目,通過提供基于JPA的Repository極大的減少了JPA作為數(shù)據(jù)訪問方案的代碼量瘤泪,你僅僅需要編寫一個接口集成下SpringDataJPA內(nèi)部定義的接口即可完成簡單的CRUD操作。

前言

本篇文章引導(dǎo)你通過Spring BootSpring Data JPAMySQL實(shí)現(xiàn)一對一外鍵關(guān)聯(lián)映射买窟。

準(zhǔn)備

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

技術(shù)棧

  • Spring Data JPA
  • Spring Boot
  • MySQL

目錄結(jié)構(gòu)

父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>

一對一外鍵

目錄結(jié)構(gòu)

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>
一對一關(guān)系

book.book_detail_idbook_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;
實(shí)體類
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聲明此對象映射到數(shù)據(jù)庫的數(shù)據(jù)表胚迫,通過它可以為實(shí)體指定表(talbe),目錄(Catalog)和schema的名字。該注釋不是必須的汇恤,如果沒有則系統(tǒng)使用默認(rèn)值(實(shí)體的短類名)庞钢。

  • @Id 聲明此屬性為主鍵。該屬性值可以通過應(yīng)該自身創(chuàng)建因谎,但是Hibernate推薦通過Hibernate生成

  • @GeneratedValue 指定主鍵的生成策略基括。

    1. TABLE:使用表保存id值
    2. IDENTITY:identitycolumn
    3. SEQUENCR :sequence
    4. AUTO:根據(jù)數(shù)據(jù)庫的不同使用上面三個
  • @Column 聲明該屬性與數(shù)據(jù)庫字段的映射關(guān)系。

  • @OneToOne 一對一關(guān)聯(lián)關(guān)系

  • @JoinColumn 指定關(guān)聯(lián)的字段

Spring Data JPA Repository
public interface BookRepository extends JpaRepository<Book, Integer> {
}

Spring Data JPA包含了一些內(nèi)置的Repository财岔,實(shí)現(xiàn)了一些常用的方法:findone风皿,findallsave等使鹅。

application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost/jpa_onetoone_foreignkey
    username: root
    password: admin
    driver-class-name: com.mysql.jdbc.Driver
  jpa:
    show-sql: true
BookRepositoryTest
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class BookRepositoryTest {

    @Autowired
    private BookRepository bookRepository;

    @Test
    public 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());
    }

    @Test
    public 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


??????關(guān)注微信小程序java架構(gòu)師歷程
上下班的路上無聊嗎?還在看小說患朱、新聞嗎鲁僚?不知道怎樣提高自己的技術(shù)嗎?來吧這里有你需要的java架構(gòu)文章裁厅,1.5w+的java工程師都在看冰沙,你還在等什么?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末执虹,一起剝皮案震驚了整個濱河市拓挥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌袋励,老刑警劉巖侥啤,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茬故,居然都是意外死亡盖灸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門磺芭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赁炎,“玉大人,你說我怎么就攤上這事钾腺♂愕妫” “怎么了讥裤?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長姻报。 經(jīng)常有香客問我己英,道長,這世上最難降的妖魔是什么吴旋? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任剧辐,我火速辦了婚禮,結(jié)果婚禮上邮府,老公的妹妹穿的比我還像新娘荧关。我一直安慰自己,他們只是感情好褂傀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布忍啤。 她就那樣靜靜地躺著,像睡著了一般仙辟。 火紅的嫁衣襯著肌膚如雪同波。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天叠国,我揣著相機(jī)與錄音未檩,去河邊找鬼。 笑死粟焊,一個胖子當(dāng)著我的面吹牛冤狡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播项棠,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼悲雳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了香追?” 一聲冷哼從身側(cè)響起合瓢,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎透典,沒想到半個月后晴楔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峭咒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年税弃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讹语。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡钙皮,死狀恐怖蜂科,靈堂內(nèi)的尸體忽然破棺而出顽决,到底是詐尸還是另有隱情短条,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布才菠,位于F島的核電站茸时,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赋访。R本人自食惡果不足惜可都,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚓耽。 院中可真熱鬧渠牲,春花似錦、人聲如沸步悠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鼎兽。三九已至答姥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谚咬,已是汗流浹背鹦付。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留择卦,地道東北人敲长。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像秉继,于是被迫代替她去往敵國和親潘明。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容