• 011一对一 唯一外键关联映射_单向(one-to-one)


    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号)

    ²  有两种策略可以实现一对一的关联映射

    • 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。
    • 唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系。

    实例场景:人—-> 身份证号(PersonàIdCard),从IdCard看不到Person对象

    对象模型实体类与一对一主键关联实体类相同,没有变化。

    IdCard实体映射文件与主键关联映射文件相同:

    <hibernate-mapping>
    
        <class name="com.wjt276.hibernate.IdCard" table="t_idcard">
    
            <id name="id" column="id">
    
                <generator class="native"/>
    
            </id>
    
            <property name="cardNo"/>
    
        </class>
    
    </hibernate-mapping>

    Person实体类映射文件:

    <hibernate-mapping>
    
        <class name="com.wjt276.hibernate.Person" table="t_person">
    
            <id name="id" column="id">
    
                <generator class="native"/>
    
            </id>
    
            <property name="name"/> 
    
    <!-- <many-to-one>:在多的一端(当前Person一端),加入一个外键(当前为idCard)指向一的一端(当前IdCard),但多对一 关联映射字段是可以重复的,所以需要加入一个唯一条件unique="true",这样就可以此字段唯一了。-->
    
            <many-to-one name="idCard" unique="true"/>
    
        </class>
    
    </hibernate-mapping>

    导出至数据库生成表SQL语句如下:

    create table t_idcard (id integer not null auto_increment, cardNo varchar(255), primary key (id))

    create table t_person (id integer not null auto_increment, name varchar(255), idCard integer unique, primary key (id))

    alter table t_person add index FK785BED80BE010483 (idCard), add constraint FK785BED80BE010483 foreign key (idCard) references t_idcard (id)

    一对一 唯一外键 关联映射存储测试:

    session = HibernateUtils.getSession();
    
                tx = session.beginTransaction();
    
     
    
                IdCard idCard = new IdCard();
    
                idCard.setCardNo("88888888888888888888888");
    
                /**
    
                 * 如果先不保存idCard,则出抛出Transient异常,因为idCard不是持久化状态。
    
                 */
    
                session.save(idCard);
    
               
    
                Person person = new Person();
    
                person.setName("菜10");
    
                person.setIdCard(idCard);
    
     
    
                session.save(person);
    
     
    
                // 提交事务
    
                tx.commit();

    产生SQL语句:

    Hibernate: insert into t_idcard (cardNo) values (?)

    Hibernate: insert into t_person (name, idCard) values (?, ?)

    总结:

    一对一 唯一外键关联映射得 多对一 关联映射的特例,

           可以采用<many-to-one>标签,指定多的一端的unique=true,这样的化就限制了多的一端的唯一。就是通过这种手段映射一对一 唯一外键关联。

  • 相关阅读:
    按指定时间段分组统计
    SQL 截取字符
    SQL日期转换
    CentOS7安装rabbitMQ,并实现浏览器访问
    springdata的jpa配置文件application.xml
    在Ubuntu上安装Hive
    在Ubuntu上安装Spark
    在Ubuntu上安装Hbase
    在Ubuntu上安装hadoop-2.7.7
    springboot整合springdatajpa时jar冲突
  • 原文地址:https://www.cnblogs.com/crazylqy/p/4077952.html
Copyright © 2020-2023  润新知