第一种一对一

person和card,card的id即作为主键,又作为外键 

// 各村对方的一个对象
public class Person { private Integer id;
private String name;
private Card card;
}
public class Card { private Integer id;
private String cardnum;
private Person person;
}

xxx.hbm.xml 的配置

记得在总配置文件中添加这两个配置文件 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Card" table="card">
<id name="id">
<!-- 主键生成策略变成foreign,表示又当主键又当外键 -->
<generator class="foreign">
<!-- 这个person是属性,指明用card这个类的person属性对应的表的主键作外键 -->
<param name="property">person</param>
</generator>
</id>
<property name="cardnum"/>
<one-to-one name="person" class="Person"/>
</class> </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Person" table="person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- cascade="delete"表示删除人的时候把卡删了 -->
<one-to-one cascade="delete" name="card" class="Card"/> </class> </hibernate-mapping>

程序执行

        Person p = new Person();
p.setUsername("tom"); Card c = new Card();
c.setCardnum("12");
c.setPerson(p); session.save(p);
session.save(c);
/* 这时候有两条sql,都是insert,改变save(p),save(c)的顺序式没用的
因为card的insert必须要有id,id不能为空,因为它作为主键,所以程序只能
先save(p)*/ Person p = new Person();
p.setUsername("tom"); Card c = new Card();
c.setCardnum("12"); p.setCard(c); session.save(p);
session.save(c); /* 这样做就会报错了,因为主键的生成策略是从card找person属性
所以这种情况就只能让又当主键又当外键的那个表来维护关系 */

查询     这种情况下的查询都是联接查询,有捆绑性

Card card = (Card) session.get(Card.class, 2);
System.out.println(card.getCardnum());
System.out.println(card.getPerson().getName()); Person p = (Person) session.get(Person.class, 2);
System.out.println(p.getName());
System.out.println(p.getCard().getCardnum());

删除

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Person" table="person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- cascade="delete"表示删除人的时候把卡删了 -->
<one-to-one cascade="delete" name="card" class="Card"/> </class> </hibernate-mapping>

----------------------------------------------------------
----------------------------------------------------------
----------------------------------------------------------

第二种一对一,是一对多或者多对一的特殊情况,具有延迟加载的能力

dept和Employee,dept中有eid,Employee中有deptid 

// 各村对方的一个对象
public class Dept { private Integer id;
private String name;
private Employee employee;
}
public class Employee { private Integer id;
private String name;
private Dept dept;
}

xxx.hmb.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Dept" table="dept">
<id name="id">
<generator class="native"/>
</id> <property name="name"/>
<!-- 是多对一的特殊情况,需要指定unique="true"唯一性 -->
<many-to-one name="employee" class="Employee" unique="true" column="eid"/> </class> </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Employee" table="employee">
<id name="id">
<generator class="native"/>
</id> <property name="name"/>
<!-- 是多对一的特殊情况,需要指定unique="true"唯一性 -->
<many-to-one name="dept" class="Dept" unique="true" column="deptid"/> </class> </hibernate-mapping>

程序执行

Employee e = new Employee();
e.setName("jack"); Dept d = new Dept();
d.setName("hr"); d.setEmployee(e); e.setDept(d); session.save(e);
session.save(d);

请看这里,这是双向维护关系,而且必须双向维护关系,不可避免的会多一条update语句

hibernate 数据关联一对一的更多相关文章

  1. hibernate 数据关联一对一 3.2

    第一种一对一 person和card,card的id即作为主键,又作为外键  // 各村对方的一个对象 public class Person { private Integer id; privat ...

  2. hibernate 数据关联一对多 3.1

    一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...

  3. hibernate 数据关联一对多

    一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...

  4. hibernate 数据关联多对多 4.1

    多对多,必须有一张关系表来维持关系 数据库student,teacher student_teacher 三张表 但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业 ...

  5. hibernate 数据关联多对多

    多对多,必须有一张关系表来维持关系 数据库student,teacher student_teacher 三张表 但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业 ...

  6. hibernate之关于一对一单向,双向关联映射

    [hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的. 唯一的不同就是单向一 ...

  7. hibernate 关系映射之 单向外键关联一对一

    这里的关系指的是对象与对象之间的关系 注解方式单向关联一对一: //这个类描述的husband是一个对应一个wife的 import javax.persistence.Entity; import ...

  8. Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射

                                                        Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...

  9. 初识Hibernate之关联映射(二)

    上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多.本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种: 基于外键的单向一对一关联映射 基于主键的单向一对一关联映射 单 ...

随机推荐

  1. Docker dubbo 服务注册

    vim run.sh #!/bin/baship=`ifconfig eth0 |grep "inet"|awk '{print $2}'`hn=dubbo-service-pro ...

  2. springcloud zuul 使用zuulfilter 修改请求路径和响应头

    最近做项目有一个需求:一个网盘系统,文件存放在分布式文件系统中,之前的文件下载统一走的文件下载服务,现在需要在单文件下载的时候不需要走文件下载服务,而是直接访问文件系统上的路径,响应的时候修改响应头, ...

  3. iOS8 with Swift

    Ref:iOS8 Day-by-Day Ref:iOS8-day-by-day source Ref:Let's Swift Ref:Swift 代码库 Ref:iOS Apprentice Thir ...

  4. 坑爹的Hibernate 映射文件错误提示org.xml.sax.SAXParseException

    今天整整一个上午都在和hibernate做斗争,早上一来,继续昨天的项目开发,发现spring项目不能启动,从错误中看是hibernate错误,多半是hibernate配置有错误,关键是错误提示中显示 ...

  5. hive查询注意及优化tips

    Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具.使用Hive尽量按照分布式计算的一些特点来设计sql,和传统关系型数据库有区别, 所以需要去掉原有关系型数 ...

  6. curl使用说明

    默认curl使用get请求,可以使用-d方式指定使用post方式传递数据 https://www.cnblogs.com/gbyukg/p/3326825.html

  7. ICP 求解相机思路

    1.之前仍然是需要创建find_feature_matches,和pixel2cam,一个是用来匹配描述子的,一个是把像素坐标转成归一化平面坐标的.里面的变量都要带上&.2.因为是3d-3d. ...

  8. In a Web Application and Mobile (hybrid), how to know which this platform running?

    needed depending on the platform to change the CSS to suit the size of the font. for example the DbG ...

  9. 2.微信小程序-B站:需要先知道这些

    文件结构 小程序包含一个描述整体程序的 app 和多个描述各自页面的 page.一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下: 文件 必须 作用 app.js 是 小程序逻辑 app. ...

  10. Keep DNS Nameserver Order Consistency In Neutron

    一个subnet有多个dns server时,dns server在创建时就定好了,但可以update: neutron subnet-update 1a2d261b-b233-3ab9-902e-8 ...