`
RyanPoy
  • 浏览: 51236 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

hibernate入门使用系列 6-- annotation关系映射篇(上)

阅读更多

次讲@OneToOne的用法。而且是基于主外键的关联。因为这个是实际开发中最最常见的。

这里先说明一下,我的java类的命名都以Test开头。而对应的对象名却没有用test开头。这里是为了更好的说明注视中的value到底是类名还是对象名。

 

 

先看java代码:

TestUser

package net.paoding.forum.domain;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Entity
public class TestUser
{
    String   id;
    String   username;
    TestCard card;

    /**
     * @return the id
     */
    @Id
    public String getId()
    {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(String id)
    {
        this.id = id;
    }

    /**
     * @return the username
     */
    public String getUsername()
    {
        return username;
    }

    /**
     * @param username the username to set
     */
    public void setUsername(String username)
    {
        this.username = username;
    }

    /**
     * @return the card
     */
   @OneToOne
    public TestCard getCard()
    {
        return card;
    }

    /**
     * @param card the card to set
     */
    public void setCard(TestCard card)
    {
        this.card = card;
    }

}

 

TestCard:

package net.paoding.forum.domain;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class TestCard
{
    String id;
    String cardNumber;

    /**
     * @return the id
     */
    @Id
    public String getId()
    {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(String id)
    {
        this.id = id;
    }

    /**
     * @return the cardNumber
     */
    public String getCardNumber()
    {
        return cardNumber;
    }

    /**
     * @param cardNumber the cardNumber to set
     */
    public void setCardNumber(String cardNumber)
    {
        this.cardNumber = cardNumber;
    }
}

 

这样子就是OneToOne了。这个是单向的关系,即:由TestCard控制TestUser。看sql语句就知道了。

hibernate自动生成的sql为:

drop table test_card cascade constraints;

drop table test_user cascade constraints;

create table test_card (
    id varchar2(255 char) not null,
    card_number varchar2(255 char),
    primary key (id)
);

create table test_user (
    id varchar2(255 char) not null,
    username varchar2(255 char),
    card_id varchar2(255 char),
    primary key (id)
);

alter table test_user 
    add constraint FKB9A96B58A237D846 
    foreign key (card_id) 
    references test_card;

 

个人认为,应该这样子理解OneToOne。

首先,他是用来申明在方法上的。(这句好似废话)

然后,他其实是用来描述这个方法的返回值的。即:描述TestCard的。也就是说:TestCard 为控制方。TestUser为被控方。那么对应的表中,test_user表有一个外键字段对应着test_card表中的一个主键。

这样,就好理解了。

 

上面的为单向关联。那么,双向关联呢?修改TestCard如下:

package net.paoding.forum.domain;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Entity
public class TestCard
{
    String   id;
    String   cardNumber;
    TestUser user;

    /**
     * @return the id
     */
    @Id
    public String getId()
    {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(String id)
    {
        this.id = id;
    }

    /**
     * @return the user
     */
    @OneToOne
    public TestUser getUser()
    {
        return user;
    }

    /**
     * @param user the user to set
     */
    public void setUser(TestUser user)
    {
        this.user = user;
    }

    /**
     * @return the cardNumber
     */
    public String getCardNumber()
    {
        return cardNumber;
    }

    /**
     * @param cardNumber the cardNumber to set
     */
    public void setCardNumber(String cardNumber)
    {
        this.cardNumber = cardNumber;
    }
}

 

这样,产生的sql为:

drop table test_card cascade constraints;

drop table test_user cascade constraints;

create table test_card (
        id varchar2(255 char) not null,
        card_number varchar2(255 char),
        user_id varchar2(255 char),
        primary key (id)
    );

create table test_user (
    id varchar2(255 char) not null,
    username varchar2(255 char),
    card_id varchar2(255 char),
    primary key (id)
);

alter table test_card 
        add constraint FKB9A0FA9D7876DA66 
        foreign key (user_id) 
        references test_user;

alter table test_user 
    add constraint FKB9A96B58A237D846 
    foreign key (card_id) 
    references test_card;
 

可以看到,当我双方都声明了OneToOne时候,也就达到了双向的One2One效果。但是很遗憾。Hibernate不知道你由哪边控制哪边,或者说由哪边来维护关系。所以,他生成的sql语句中可以看到,都有test_card和test_user是相互关联的,即:都有FK关联上堆放的PK。很明显,这个不是我们要的效果。

我们需要的是,po中能双向one2one,但是db中不需要。所以,我们需要修改一下。

 

修改TestCard.java代码:

package net.paoding.forum.domain;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Entity
public class TestCard
{
    String   id;
    String   cardNumber;
    TestUser user;

    /**
     * @return the id
     */
    @Id
    public String getId()
    {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(String id)
    {
        this.id = id;
    }

    /**
     * @return the user
     */
    @OneToOne(mappedBy="card")
    public TestUser getUser()
    {
        return user;
    }

    /**
     * @param user the user to set
     */
    public void setUser(TestUser user)
    {
        this.user = user;
    }

    /**
     * @return the cardNumber
     */
    public String getCardNumber()
    {
        return cardNumber;
    }

    /**
     * @param cardNumber the cardNumber to set
     */
    public void setCardNumber(String cardNumber)
    {
        this.cardNumber = cardNumber;
    }
}
 

注意annotation的部分。mappedBy就指出了此处返回的TestUser对应的test_user表中有一个指向TestUser的属性"card"的外键。可以看sql。

drop table test_card cascade constraints;

drop table test_user cascade constraints;

create table test_card (
    id varchar2(255 char) not null,
    card_number varchar2(255 char),
    primary key (id)
);

create table test_user (
    id varchar2(255 char) not null,
    username varchar2(255 char),
    card_id varchar2(255 char),
    primary key (id)
);

alter table test_user 
    add constraint FKB9A96B58A237D846 
    foreign key (card_id) 
    references test_card;
 

 

而这得"mappedBy=card"中的card是TestUser中的TestCard类型的成员变量名。这也就是为什么我要用Test修饰类名,而对象名却不用的理由。

 

或者,还可以这样子来理解OneToOne。

单向OneToOne中。声明了OneToOne这个Annotation的方法,他的返回值即:维护方。(主键方)

双向OneToOne中。在OneToOne中声明了mappedBy="xx"的,他的返回值即:被维护方。(外键方)

 

 

分享到:
评论

相关推荐

    Hibernate Annotation入门

    而Hibernate Annotation是Hibernate的一个重要特性,它通过在Java类和字段上添加注解来简化数据库表和实体类之间的映射配置。这篇博文将带你了解如何使用Hibernate Annotation进行开发。 首先,我们需要理解Java...

    Hibernate学习笔记(1-13)

    Hibernate是一个流行的ORM(对象关系映射)框架,它旨在解决Java面向对象编程与关系型数据库之间的模型不匹配问题,即“阻抗不匹配”。通过Hibernate,开发者可以使用面向对象的方式来操作数据库,而无需关心底层的...

    5天入门hibernate

    hibernate是Java开发中的一款流行的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库操作。在"5天入门hibernate"的学习计划中,你将深入理解hibernate的核心概念和基本...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    hibernate初学者很好的资料

    3. Annotation配置:相比于XML配置,使用Java注解可以更简洁地定义实体类和映射关系。 4. Mapping:对象到表的映射,包括一对一、一对多、多对一和多对多的关系映射。 5. Cascade:级联操作允许在一个实体的保存、...

    hibernate的知识总结

    **Hibernate类型与Oracle数据类型的映射关系**:例如,`java.lang.Long` 对应于Oracle的 `NUMBER` 类型,`java.lang.String` 对应 `VARCHAR2`,`java.lang.Double` 对应 `NUMBER`,`java.sql.Timestamp` 对应 `...

    HibernateAPI中文版.chm

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    hibernate3.2中文文档(chm格式)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    hibernate入门教程

    5. **映射文件(Mapping File)**: `.hbm.xml`文件用于定义实体类与数据库表之间的映射关系,也可以使用注解方式(Annotation)来完成映射。 三、Hibernate配置 在使用Hibernate之前,需要进行一些基本的配置,包括...

    Hibernate O/R Mapping 入门工程包

    **Annotation映射** 随着Java注解的流行,Hibernate也支持使用注解来代替XML进行映射。在`HbmUser`类中,我们可以看到如下注解: ```java @Entity @Table(name = "USER") public class HbmUser { @Id @...

    马士兵hibernate笔记

    本教程通过一系列课程,逐步讲解Hibernate的使用方法和核心概念。 在第1至第6课中,教程从基础入手,介绍了Hibernate的基本概念,包括UML图的使用,以及如何创建第一个简单的Hibernate项目`HibernateHelloWorld`。...

    hibernate学习笔记

    #### 一、HelloWorld与Hibernate入门 - **HelloWorld实践**:初学者应从创建一个简单的Java项目开始,名为`hibernate_0100_HelloWorld`,在此项目中引入`User-library-hibernate`,包含所有必要的jar包,并集成MySQL...

    Hibernate+中文文档

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    hibernate_validator_reference_5.1.3.pdf

    本文将详细阐述Hibernate Validator的使用方法、验证机制、自定义约束以及通过XML配置验证器的实例和最佳实践。 ### Hibernate Validator基础 Hibernate Validator 5.1.3版本的参考文档主要分为以下几个部分: ##...

    Hibernate中文详细学习文档

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    java学习笔记(文字整理版).doc

    ### Java学习笔记——Java与Hibernate入门精要 #### 一、Java学习笔记概述 本学习笔记旨在帮助初学者系统地掌握Java语言的基础知识,并通过实际案例深入理解Hibernate框架的应用。通过对核心概念和技术点的详细解释...

    Hibernate 中文 html 帮助文档

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    hibernate程序

    **Hibernate 程序入门详解** Hibernate 是一个流行的开源对象关系映射(ORM)框架,它简化了 Java 应用程序与数据库之间的交互。在这个教程中,我们将学习如何创建第一个 Hibernate 程序,采用 Annotation 版本,也...

    hibernate 体系结构与配置 参考文档(html)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

Global site tag (gtag.js) - Google Analytics