第一种一对一

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. require.js vs browserify

    require.js vs browserify require.js是模块加载器:browserify是预编译工具 require.js遵循的是AMD规范:browserify遵循的是CommonJ ...

  2. 关于date和String互相转换的问题

    其实原理很简单,就是将String类型的变量使用SimpleDateFormat来转换成Date,然后用getTime()方法比较 SimpleDateFormat sdf = new SimpleD ...

  3. jQuery设计理念

    jQuery设计理念 引用百科的介绍: jQuery是继prototype之后又一个优秀的Javascript框架.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1. ...

  4. 每天一个Linux命令(7)pwd命令

    pwd命令以绝对路径的方式显示用户当前工作目录.命令将当前目录的全路径名称(从根目录)写入标准输出.全部目录使用/分隔.第一个/表示根目录,最后一个目录是当前目录.     (1)用法介绍: pwd[ ...

  5. python内置方法补充all

    all(iterable) 版本:该函数在python2.5版本首次出现,适用于2.5以上版本,包括python3,兼容python3版本. 说明:如果iterable的所有元素不为0.''.Fals ...

  6. dsp2812 pwm配置

    肚子疼了好几天,今天稍微好点,简单写点东西. 好几个月前做的项目,有些地方已经记不清楚了,但是突然客户又来问关于代码配置的情况,重新查看了代码,把相关的知识也整理一下. dsp2812中有好几个时钟相 ...

  7. etcd -> Highly-avaliable key value store for shared configuration and service discovery

    The name "etcd" originated from two ideas, the unix "/etc" folder and "d&qu ...

  8. SrpingCloud 之SrpingCloud config分布式配置中心

    Config架构 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现微服务中的所有系统的配置文件的统一管理,而且还可 ...

  9. Delphi中 为DBNavigator的按钮加中文

    Delphi中 为DBNavigator的按钮加中文 /*Delphi中数据库控件DBNavigator使用起来不错,但是按钮上“+”.“-”等含义对于中国的用户不习惯,甚至不知道是什么含义.改成相应 ...

  10. jquery的ajax(err)

    load()方法 load()方法是jquery中最为简单和常用的ajax方法. 直接使用ajax技术的流程 1.创建xmlhttprequest对象 2.调用open函数("提交方式&qu ...