一对一主键关联

el/2024/6/13 20:51:07

*一对一主键关联:单向:Person这一端看的!!!!!

   


                                                                

Person引用了IdCard,所有IdCard必须先有值

主键关联:t_person中主键不是自己生成的,引用t_idcard的!!所以要持有IdCard的引用

实体类:

class IdCard

private int id;

private String cardNo;

class Person

            private int id;

           private String name;

       private IdCard idCard;//使这两个pojo关联起来

 

映射文件:

IdCard

<hibernate-mapping>

    <class name="com.guojie.hibernate.IdCard" table="t_idcard">

       <id name="id">

           <generator class="native"></generator>

       </id>

       <property name="cardNo"/>

    </class>  

</hibernate-mapping>

 

Person

    <class name="com.guojie.hibernate.Person" table="t_person">

       <id name="id">

           <generator class="foreign">

              <!—name=”propertye”固定,表明主键来源于IdCard的主键,idCard找到Person中的属性IdCard,再找到IdCard的标识 -->

              <param name="property">idCard</param>

           </generator>

       </id>

       <property name="name"/>

       <!-- idCard表示:外键 -->

       <!—加载Person的时候,IdCard找到Person的主键,然后把IdCard加载进来(默认根据主键加载),放到PersonidCard属性中-->

       <!--constrained="true":表明Person的主键还是外键,参考至IdCard的主键-->  去掉constrained="true" 程序loadsave正常,为什么???

       <one-to-one name="idCard" constrained="true"/>

    </class>  

 

测试代码:

public void testSave1(){

       Session session = null;

       try{

           session = HibernateUtils.getSession();

           session.beginTransaction();

          

           IdCard idCard = new IdCard();

           idCard.setCardNo("8888888");

          

           Person person = new Person();

           person.setName("10");

           person.setIdCard(idCard);

           //在保存person的时候自动保存IdCard

           //只有一对一主键关联中默认实现了cascade属性,保存person的自动先把IdCard保存了

           //IdCard中的主键取来当作person中的主键

           session.save(person);

 

           session.getTransaction().commit();

       }catch(Exception e){

           e.printStackTrace();

           session.getTransaction().rollback();

       }finally{

           HibernateUtils.closeSession(session);

       }

    }

public void testLoad1(){

       Session session = null;

       try{

           session = HibernateUtils.getSession();

           session.beginTransaction();

          

           Person person = (Person)session.load(Person.class, 1);

           System.out.println(person.getName());

           System.out.println(person.getIdCard().getCardNo());

          

          

           session.getTransaction().commit();

       }catch(Exception e){

           e.printStackTrace();

           session.getTransaction().rollback();

       }finally{

           HibernateUtils.closeSession(session);

       }

    }

*一对一单向关联(Person-->IdCard)

 

*一对一主键关联映射:让两个实体对应的id保持相同,这样可以避免多于字段被创建

 

*具体映射:

    <id name="id">

            <generator class="foreign">

                <!--person的主键来源idCardperson中的主键从idCard中找的!!共享idCard的主键-->

                <param name="property">idCard</param>

            </generator>

        </id>

        <property name="name"/>

        <!--one-to-one:指示hibernate怎么加载它的关联对象,默认根据主键->

        <!--constrained="true":表明当前的主键还是外键,加入了外键约束-->

        <one-to-one name="idCard" constrained="true"/>

 

*以上例子:只能Person端加载IdCard端,IdCard端无法加载Person

 

加入IdCard端加载Person端,变成了双向,从两端都可以加载,例子:

    则实体类IdCard中要持有Person的引用,Person类要持有IdCard的引用

private int id;

    private String cardNo;

    private Person person;

IdCard的映射:

    <class name="com.guojie.hibernate.IdCard" table="t_idcard">

       <id name="id">

           <generator class="native"></generator>

       </id>

       <property name="cardNo"/>

       <!-- constrained="true" :根据人的id加载IdCard -->

       <one-to-one name="person" constrained="true">

       </one-to-one>

    </class>  

Person的映射:

    <class name="com.guojie.hibernate.Person" table="t_person">

       <id name="id">

           <generator class="foreign">

              <!-- name:固定 idCardPerson中的外键,表示参考至IdCard -->

              <param name="property">idCard</param>

           </generator>

       </id>

       <property name="name"/>

       <!-- idCard表示:外键 -->

       <!-- true:根据主键加载关联对象 -->

       <!--constrained="true":人的id来自身份证的id,不能与IdCard中同时配这个属性-->

       <one-to-one name="idCard" />

    </class>

!!两边同时去掉constrained="true">也能正确加载!!!???

Person端加载例子:也可以IdCard端加载

public void testLoad1(){

       Session session = null;

       try{

           session = HibernateUtils.getSession();

           session.beginTransaction();

          

           Person person = (Person)session.load(Person.class,1);

           System.out.println(person.getName());

           System.out.println(person.getIdCard().getCardNo());

          

          

           session.getTransaction().commit();

       }catch(Exception e){

           e.printStackTrace();

           session.getTransaction().rollback();

       }finally{

           HibernateUtils.closeSession(session);

       }

    }


http://www.ngui.cc/el/4893657.html

相关文章

一对一唯一外键关联(单双向)

*一对一唯一外键关联:要加入一个外键 唯一外键单向:Person能加载到IdCard,IdCard不能加载到Person 对象模型: IdCard : private int id; private String cardNo; Person private int id; private String name; private IdCard idCard; 映射文件: IdCard: <class …

struts.xml向页面传参

请求地址&#xff1a; <a href"actions/user1?type1">传参数forward情况</a><br><br> <a href"actions/user2?type1">传参数redirect情况</a> Action&#xff1a; private String type; public String getType() …

Struts s:if 标签 判断中文

username 来自action 在页面上取得username的值 <s:set name"un" value"username"/> 比较语句这样写 <s:if test"#un M">**** </s:if> 这样写是错误的. 正确的写法如下: <s:if test#un "M">**** </s:if&…

EE5 jar 冲突解决办法

EE5 jar冲突报错&#xff1a;javax.servlet.ServletException: java.lang.LinkageError: loader constraint violation: 解决办法&#xff1a;去掉Maven自带的EE5jar

牛奶洗面--对付脸色暗沉

牛奶洗面&#xff0d;&#xff0d;对付脸色暗沉 速度&#xff1a;5天 用牛奶洗面可以帮你在5日内“换肤”&#xff01;你相信吗&#xff1f;贵的护肤品自然有其价值&#xff0c;天然用品却非平货无好&#xff0c;两者Mix&#xff06;Match&#xff0c;一样有杰作产生&#xff0…

群聊话题

1. 一个城市里有三个人&#xff1a; 甲有5套房&#xff0c;不上班&#xff0c;靠收房租生活&#xff1b; 乙有1套房&#xff0c;上班赚工资&#xff1b; 丙无房&#xff0c;租房子住&#xff0c;菜场卖菜。 忽然有天要收房产税了&#xff0c;丙说&#xff1a;“太好了&#xff…

Struts2 Iterator 标签

struts2的s&#xff1a;iterator 可以遍历 数据栈里面的任何数组&#xff0c;集合等等 以下几个简单的demo&#xff1a; s:iterator 标签有3个属性&#xff1a; value&#xff1a;被迭代的集合 id &#xff1a;指定集合里面的元素的id status 迭代元素的索引 1:jsp页面定义元素…

Struts2 xml 配置 常量 action_转

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> …

Myeclipse快捷键_转

Ctrl Shift O: 引入imports语句 Ctrl Shift T: 打开Open Type查找类文件 Ctrl Shift F4: 关闭打开的所有窗口 Ctrl Shift F: 整形 Ctrl Alt ↓(↑) : 向下(上)复制本行 (搞笑) Ctrl D : 删除本行 Ctrl O: Open declarations F3 : Open Declaration Ctrl E …

Struts2 Spring 整合的两种方案_转

一、需要的JAR文件为&#xff1a;Spring和Struts2框架本身需要的JAR文件以及他们所依赖的JAR文件&#xff0c;比如commons-logging.jar等等&#xff0c;另外还需要Struts2发布包中的struts2-spring-plugin-x.xx.jar。 二、在web.xml中增加WebApplicationContext的相应配置&…