美文网首页JavaWeb
Hibernate One-To-One Mapping

Hibernate One-To-One Mapping

作者: ElyarAnwar | 来源:发表于2017-03-07 15:30 被阅读57次
    • Hibernate 一对一映射关系(唯一外键映射)
    • 用户基本信息与扩展信息的映射关系

    我们先来看看这一对一映射可以用在什么场景。

    需求:录入用户基本信息,并且可以扩展用户扩展信息

    那么我们可以知道 用户基本信息用户扩展信息 是形成一 一对应关系的

    关系图如下:


    one-to-one mapping

    表创建SQL:
    <pre>
    CREATE TABLE BaseInfo (
    baseinfo_id VARCHAR(32) NOT NULL ,
    baseinfo_mobile VARCHAR(11) NOT NULL UNIQUE,
    extendinfo_id VARCHAR(32) NOT NULL,
    PRIMARY KEY (baseinfo_id)
    );

    CREATE TABLE ExtendInfo (
    extendinfo_id VARCHAR(32) NOT NULL ,
    extendinfo_email VARCHAR(32),
    extendinfo_weibo VARCHAR(32),
    extendinfo_qq VARCHAR(32),
    extendinfo_wechat VARCHAR(32),
    PRIMARY KEY (extendinfo_id)
    );

    ALTER TABLE BaseInfo ADD CONSTRAINT BaseInfo_fk0 FOREIGN KEY (extendinfo_id) REFERENCES ExtendInfo(extendinfo_id);

    </pre>

    扩展信息表中的主键ID作为基本信息表的外键

    两个实体类的Java代码:

    基本信息 BaseInfo

    <pre>
    package com.elyar.spring.entity;

    import org.hibernate.annotations.GenericGenerator;

    import javax.persistence.*;

    /**

    • Created by ElyarAnwar on 2017/3/7.
      */

    @Entity
    @Table(name = "BaseInfo")
    public class BaseInfo {

    @Id
    @GenericGenerator(name = "uuid", strategy = "uuid")
    @GeneratedValue(generator = "uuid")
    private String baseinfo_id;
    

    </br>
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn("extendinfo_id")
    private ExtendInfo extendinfo_id;
    </br>
    public BaseInfo() {
    }
    </br>
    public BaseInfo(ExtendInfo extendinfo_id) {
    this.extendinfo_id = extendinfo_id;
    }
    </br>
    public String getBaseinfo_id() {
    return baseinfo_id;
    }
    </br>
    public void setBaseinfo_id(String baseinfo_id) {
    this.baseinfo_id = baseinfo_id;
    }
    </br>
    public ExtendInfo getExtendinfo_id() {
    return extendinfo_id;
    }
    </br>
    public void setExtendinfo_id(ExtendInfo extendinfo_id) {
    this.extendinfo_id = extendinfo_id;
    }
    }
    </pre>

    扩展信息 ExtendInfo

    <pre>
    package com.elyar.spring.entity;

    import org.hibernate.annotations.GenericGenerator;

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;

    /**

    • Created by ElyarAnwar on 2017/3/7.
      */
      @Entity
      @Table(name = "ExtendInfo")
      public class ExtendInfo {

      @Id
      @GenericGenerator(name = "uuid", strategy = "uuid")
      @GeneratedValue(generator = "uuid")
      private String extendinfo_id;

      </br>
      // 用户扩展信息-邮箱
      private String extendinfo_email;
      </br>
      // 用户扩展信息-微博
      private String extendinfo_weibo;
      </br>
      // 用户扩展信息-QQ
      private String extendinfo_qq;
      </br>
      // 用户扩展信息-微信
      private String extendinfo_wechat;
      </br>
      public ExtendInfo() {
      }
      </br>
      public ExtendInfo(String extendinfo_email, String extendinfo_weibo, String extendinfo_qq, String extendinfo_wechat) {
      this.extendinfo_email = extendinfo_email;
      this.extendinfo_weibo = extendinfo_weibo;
      this.extendinfo_qq = extendinfo_qq;
      this.extendinfo_wechat = extendinfo_wechat;
      }
      </br>
      public String getExtendinfo_id() {
      return extendinfo_id;
      }
      </br>
      public void setExtendinfo_id(String extendinfo_id) {
      this.extendinfo_id = extendinfo_id;
      }
      </br>
      public String getExtendinfo_email() {
      return extendinfo_email;
      }
      </br>
      public void setExtendinfo_email(String extendinfo_email) {
      this.extendinfo_email = extendinfo_email;
      }
      </br>
      public String getExtendinfo_weibo() {
      return extendinfo_weibo;
      }
      </br>
      public void setExtendinfo_weibo(String extendinfo_weibo) {
      this.extendinfo_weibo = extendinfo_weibo;
      }
      </br>
      public String getExtendinfo_qq() {
      return extendinfo_qq;
      }
      </br>
      public void setExtendinfo_qq(String extendinfo_qq) {
      this.extendinfo_qq = extendinfo_qq;
      }
      </br>
      public String getExtendinfo_wechat() {
      return extendinfo_wechat;
      }
      </br>
      public void setExtendinfo_wechat(String extendinfo_wechat) {
      this.extendinfo_wechat = extendinfo_wechat;
      }
      }
      </pre>

    测试:

    <pre>
    package com.elyar.spring.test;

    import com.elyar.spring.entity.BaseInfo;
    import com.elyar.spring.entity.ExtendInfo;
    import com.elyar.spring.entity.UserBaseInfo;
    import com.elyar.spring.entity.UserExtedInfo;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    /***
    *** Created by ElyarAnwar on 2017/2/28.
    ****/
    public class Test {
    </br>
    private ApplicationContext applicationContext;
    </br>
    @org.junit.Test
    public void test() {
    </br>
    applicationContext = new ClassPathXmlApplicationContext("config/applicationContext.xml");
    SessionFactory sessionFactory = applicationContext.getBean(SessionFactory.class);
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    </br>
    BaseInfo baseInfo = new BaseInfo();
    </br>
    ExtendInfo extendInfo = new ExtendInfo();
    extendInfo.setExtendinfo_email("1389****061@163.com");
    extendInfo.setExtendinfo_qq("734****82");
    extendInfo.setExtendinfo_weibo("扔物线的轨迹");
    extendInfo.setExtendinfo_wechat("1389****061");
    </br>
    baseInfo.setExtendinfo_id(extendInfo);
    </br>
    session.save(baseInfo);
    transaction.commit();
    }

    }

    </pre>

    因为我们在BeasInfo中设置了@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    级联所有操作,所以只需保存BaseInfo即可,不然需要保存BaseInfo和ExtendInfo。

    现在来看看数据库的变化吧:

    BaseInfo Table ExtendInfo Table

    可以看到ExtendInfo表中的主键ID和BaseInfo表中的extendinfo_id是一 一 对应的。

    至此完成了用户基本信息和扩展信息的映射。

    如有问题请私信。转载请注明出处:http://www.jianshu.com/u/1c0e16576578 ElyarAnwar 分享是最好的记忆

    相关文章

      网友评论

        本文标题:Hibernate One-To-One Mapping

        本文链接:https://www.haomeiwen.com/subject/qyjmgttx.html