一对多,多对一 (在多的一端存放一的外键)
但是在实体类中不需要创建这个外键

// 在一的一方创建Set集合
public class User { private Integer id;
private String username;
private String password;
private Set<Address> addressSet;
}
//多的一方创建User的对象
public class Address { private Integer id;
private String address;
private User user;
}

在映射文件中也要配置

一对多的一:User.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="User" table="user">
<id name="id">
<generator class="native"/>
</id> <property name="username"/>
<property name="password"/>
<!-- name是类中属性的名字,站在User的角度这是一对多,所以是one-to-many
然后指定对应的多指的是哪个类.
<key column="userid"/>指维持这种关系的多的这一端(Address)类对应的表中的外键
inverse="true"表示放弃关系维护-->
<set name="addressSet" cascade="delete" inverse="true">
<key column="userid"/>
<one-to-many class="Address"/>
</set> </class>
</hibernate-mapping>

一对多的多:Address.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="Address" table="address">
<id name="id">
<generator class="native"/>
</id>
<property name="address"/>
<!-- 站在这个角度是多对一many-to-one
name写对应的属性名,class是对应的类 然后指定外键-->
<many-to-one name="user" class="User" column="userid"/> </class> </hibernate-mapping>

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

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

程序的执行

1.添加

//  方式1
User u1 = new User();
u1.setUsername("u1");
u1.setPassword("aaa"); Address a1 = new Address();
a1.setAddress("a1");
a1.setUser(u1); Address a2 = new Address();
a2.setAddress("a2");
a2.setUser(u1); /* 如果是先save的u1,就能拿到u1的id
然后再save a1,a2的时候加入外键中,等于执行了3条sql 如果是先save a1,a2 那么save的结果是没有userid这个外键的
在save了u1之后会再去update他们(因为在address关联User的时候,user是自由态
,当user保存的时候就变成了持久态,User状态发生变化会同步到数据库中,所以address会更新
),等于执行了3条sql还有两条update*/
session.save(u1);
session.save(a1);
session.save(a2); // 所以对于一对多的这种情况,先存1,再存多 // 方式2 User u1 = new User();
u1.setUsername("u1");
u1.setPassword("aaa"); Address a1 = new Address();
a1.setAddress("a1"); Address a2 = new Address();
a2.setAddress("a2"); Set<Address> set = new HashSet<Address>();
set.add(a1);
set.add(a2);
user.setAddressSet(set); // 这样即使是先存1再存多还是5条sql语句 session.save(u1);
session.save(a1);
session.save(a2);

所以在一对多的时候,关系要让多来维护,save的时候先保存一的再保存多的

可以在一的配置中inverse="true"放弃关系维护

2.查询

// 单表查询user
User user = (User) session.get(User.class, 25);
System.out.println(user.getUsername());
/* 要使用address了,单表查询address,这个是延迟查询,当使用address的时候再去查
,但是这个查询就必须放在session中才能有作用,给xxx.hbm.xml配置
lazy="false" 就能取消这个延迟查询,不管你用不用address,但是只要你用user我都会查关联user
的一切比如(address,这个时候就可以放在session外边了因为查询过后已经放入了内存中*/
Set<Address> set = user.getAddressSet();
for(Address a : set) {
System.out.println(a.getAddress());
} // 或者反过来用address查询,也都是两条单表查询
Address a1 = (Address) session.get(Address.class, 17);
System.out.println(a1.getAddress());
System.out.println(a1.getUser().getUsername());

hibernate默认就是这样的单表查询,但是我们可以改成联接查询 -->
<!-- 添加fetch="join"表示用一条sql语句查询到所有包括关联的..所以只要不是
你能承受这么多查询,都要使用以前的延迟查询

<set name="addressSet" cascade="delete" inverse="true" fetch="join">
<key column="userid"/>
<one-to-many class="Address"/>
</set>

3.级联删除

配置属性cascade="delete"属性后,默认删除一的时候把关联的多也删除掉 

<set name="addressSet" cascade="delete" inverse="true">
<key column="userid"/>
<one-to-many class="Address"/>
</set>

也删除了address

User user = (User) session.get(User.class, 26);
session.delete(user);

注:

我们在user中配置了address的Set,在address中配置了user,这叫
双向配置,实际上我们都是从user找address,很少从address找user,所以address的可以不配置

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

  1. hibernate 数据关联一对多

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

  2. hibernate 数据关联多对多 4.1

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

  3. hibernate 数据关联一对一 3.2

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

  4. hibernate 数据关联多对多

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

  5. hibernate 数据关联一对一

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

  6. Hibernate之关联映射(一对多和多对一映射,多对多映射)

    ~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...

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

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

  8. Hibernate 关联关系(一对多)

    Hibernate 关联关系(一对多) 1. 什么是关联(association) 1.1 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性.例如: class B ...

  9. Hibernate之关联关系(一对多)

    今日分享hibernate框架的简单关联关系 一:关联关系简介 1.1 什么是关联关系 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性. 例如: class B{ ...

随机推荐

  1. android环境下解决java.io.IOException: Malformed ipv6异常的方法

    今天做客户端想服务端提交信息的时候,报出了如标题所显示的方法 方法以及参数如下: 输入的参数为:http://192.168.1.173:8080/Api/petinfo/petinfo?flag=a ...

  2. 在mac系统安装Apache Tomcat的详细步骤(转载自himi的博客,修改了错误添加了图片)

    链接地址:http://blog.csdn.net/liuyuyefz/article/details/8072485 1. 2. 3. 4. 5. 对于Apache Tomcat 估计很多童鞋都会, ...

  3. SPOJ 7001 VLATTICE - Visible Lattice Points(莫比乌斯反演)

    题目链接:http://www.spoj.com/problems/VLATTICE/ 题意:求gcd(a, b, c) = 1    a,b,c <=N 的对数. 思路:我们令函数g(x)为g ...

  4. 我用过的Linux命令--虚拟机和宿主机的网络连接方式

    VMWare提供了三种工作模式,它们是bridged(bridged模式:对应网卡vment0).NAT(网络地址转换模式:对应网卡vment8)和host-only(主机模式:对应网卡vment1) ...

  5. SAE上使用本地sql文件建表时出错解决方法

    在SAE上部署网站时需要上传本地的数据库结构,我也导出了本地数据库为sql文件,但是上传到SAE上时遇到了如下错误: MySQL 返回: #1044 - Access denied for user ...

  6. django FileFIeld和ImageField 上传路径改写

    def get_file_path(instance, filename): return 'file/document/%s/%s/%s' % (instance.period.code, inst ...

  7. my.ini配置

    在家里写点东西,需要配置mysql windows版本,linux版本我一般都是直接编译后,有模板文件可以编辑,新下载的5.6没有,我用的是zip的. 在网上找了两篇博客,写的很详细: http:// ...

  8. Qt中QPushButton、QTabWidget等部件内容文字换行的解决方法(一定要写在源码里,写在翻译文件里不行,因为\n得不到转义)

    最近在做基于Qt的应用项目,其中有一个按钮文字超长,需要换一行显示.从网上找到的建议都是将要显示的内容做成图片,然后将图片设置为该按钮的背景.但是这样做有一个很大的局限性,当需要更改内容文字的时候,需 ...

  9. perl5 第三章 操作符

    第三章 操作符 by flamephoenix 一.算术操作符二.整数比较操作符三.字符串比较操作符四.逻辑操作符五.位操作符六.赋值操作符七.自增自减操作符八.字符串联结和重复操作符九.逗号操作符十 ...

  10. 关于android源码中的APP编译时引用隐藏的API出现的问题

    今天在编译android源码中的计算器APP时发现,竟然无法使用系统隐藏的API,比如android.os.ServiceManager中的API,引用这个类时提示错误,记忆中在android源码中的 ...