在领域模型中,类与类之间最普遍的关系就是关联关系
在UML中,关联是有方向的
  以Customer和Order为例:一个用户能发出多个订单,而一个订单只能属于一个客户。从Order到Customer的关联是多对一关联;而从Customer到Order是一对多关联

单向n-1
  单向n-1关联只需从n的一端可以访问到1的一端
  域模型:从Order到Customer的多对一单向关联需要在Order类中定义一个Customer属性,而在Customer类中无需定义存放Order对象的集合属性
  关系数据模型:ORDER表中的CUSTOMER_ID参照CUSTOMER表的主键

代码如下:

 package com.yl.hibernate.entities.n21;

 public class Customer {

     private Integer customerId;
private String customerName;
public Integer getCustomerId() {
return customerId;
}
public void setCustomerId(Integer customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
} }
 package com.yl.hibernate.entities.n21;

 public class Order {

     private Integer orderId;
private String orderName; private Customer customer; public Integer getOrderId() {
return orderId;
} public void setOrderId(Integer orderId) {
this.orderId = orderId;
} public String getOrderName() {
return orderName;
} public void setOrderName(String orderName) {
this.orderName = orderName;
} public Customer getCustomer() {
return customer;
} public void setCustomer(Customer customer) {
this.customer = customer;
} }

Customer.hbm.xml

 <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-11-26 19:19:40 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.yl.hibernate.entities.n21.Customer" table="CUSTOMERS">
<id name="customerId" type="java.lang.Integer">
<column name="CUSTOMER_ID" />
<generator class="native" />
</id>
<property name="customerName" type="java.lang.String">
<column name="CUSTOMER_NAME" />
</property>
</class>
</hibernate-mapping>

Order.hbm.xml

 <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-11-26 19:19:40 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.yl.hibernate.entities.n21.Order" table="ORDERS">
<id name="orderId" type="java.lang.Integer">
<column name="ORDER_ID" />
<generator class="native" />
</id>
<property name="orderName" type="java.lang.String">
<column name="ORDER_NAME" />
</property>
<!-- 映射多对一的映射关系。使用many-to-one 来映射多对一的关联关系
name:多这一端关联的一那一端的属性的名字
class:一那一端的属性对应的类名
column:一那一端在多的一端对应的数据表中的外键的名字
-->
<many-to-one name="customer" class="com.yl.hibernate.entities.n21.Customer" column="CUSTOMER_ID">
</many-to-one> </class>
</hibernate-mapping>

测试类:

 package com.yl.hibernate.entities.n21;

 import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; public class HibernateTest { private SessionFactory sessionFactory;
private Session session;
private Transaction transaction; @Before
public void init() {
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry =
new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); session = sessionFactory.openSession(); transaction = session.beginTransaction();
}
@After
public void destory() {
transaction.commit(); session.close(); sessionFactory.close();
} @Test
public void testMany2OneSave() {
Customer customer = new Customer();
customer.setCustomerName("BB"); Order order1 = new Order();
order1.setOrderName("ORDER-3"); Order order2 = new Order();
order2.setOrderName("ORDER-4"); //设定关联关系
order1.setCustomer(customer);
order2.setCustomer(customer); //执行save操作:先插入Customer,再插入Order,3条INSERT
//先插入1的一端,再插入n的一端,只有INSERT语句
/*session.save(customer); session.save(order1);
session.save(order2);*/ //先插入Order,在插入Customer. 3条INSERT, 2条UPDATE
//先插入n的一端,再插入1的一端,会多出UPDATE语句
//因为在插入多的一端时,无法确定1的一端的外键值,所以只能等1的一端插入后,在额外发送UPDATE语句
//推荐先插入1的一端,再插入n的一端
session.save(order1);
session.save(order2); session.save(customer);
} @Test
public void testMany2OneGet() {
//1.若查询多的一端的一个对象,则默认情况下,只查询了多的一端的对象,而没有查询关联的1的那一端的对象!
Order order = (Order) session.get(Order.class, 2);
System.out.println(order.getOrderName());
//2.在需要使用到关联的对象时,才发送对应的SQL语句
Customer customer = order.getCustomer();
System.out.println(customer.getCustomerName()); //3.在查询Customer对象时,由多的一端导航到1的一端时,
//若此时,session已被关闭,则默认情况下
//会发生懒加载异常 //4.获取Order对象时,默认情况下,其关联的Customer对象时一个代理对象!
} @Test
public void testUpdate() {
Order order = (Order) session.get(Order.class, 2);
order.getCustomer().setCustomerName("AAA");
} @Test
public void testDelete() {
//在不设定级联关系的情况下,且1这一端的对象有 n 的对象在引用, 则不能直接删除1这一端的对象
Customer customer = (Customer) session.get(Customer.class, 1);
session.delete(customer);
} }

Hibernate4.x之映射关系--单向一对多的更多相关文章

  1. Hibernate中的映射关系(一对多)

    在数据库中表和表之间的关系有几种,(一对一,一对多,多对多)一对一关系:可以选择任意一方插入外键(one-to-one:one-to-one<--->many-to-one[unique= ...

  2. Nhibernate 映射关系,一对多 多对一与多对手在映射文件中的体现。

    今天做了第一个Nhibernate项目,摸着石头过河,学到了一些东西,在这里将自己总结体会到的一些映射关系写出来,与大家分享,由于是初学者,如果有不对的地方希望大家能够指出来. 首先要说明要建立的几张 ...

  3. Hibernate4.x之映射关系--一对一映射

    Hibernate的1-1映射关系主要分为两类: 1.Hibernate基于外键映射的1对1关联关系 对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one ...

  4. Hibernate4.x之映射关系--双向1-n

    双向1-n与双向n-1是完全相同的两种情形 双向1-n需要在1的一端可以访问n的一端,反之亦然. 域模型:从Order到Customer的多对一双向关联需要在Order类中定义一个Customer属性 ...

  5. hibernate的映射关系之一对多

    关系:事物之间相互作用.相互联系的状态.范围最大. 联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n. 关联:表示对象之间的关系,既有数量性,又有方向性:动词:将对象之间通过某种方 ...

  6. Hibernate4.x之映射关系--继承映射

    Hibernate的继承映射可以理解为持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. Hibernate支持以下三 ...

  7. Hibernate4.x之映射关系--多对多

    n-n的关联关系分为以下两类: 1.单向n-n关联关系: n-n的关联必须使用连接表 与1-n映射类似,必须为set集合元素添加key子元素,指定CATEGORIES_ITEMS表中参照CATEGOR ...

  8. Hibernate4.2.4入门(二)——一对多的映射关系

    一.前言 前面我们已经学过hibernate的基础,学会增删改查简单的操作,然而我们数据库中存在着1对多,多对1,多对多的关系,hibernate又是基于ORM基础上的开源框架,可以让我们不用去编写S ...

  9. java框架篇---hibernate(一对多)映射关系

    一对多关系可以分为单向和双向. 一对多关系单向 单向就是只能从一方找到另一方,通常是从主控类找到拥有外键的类(表).比如一个母亲可以有多个孩子,并且孩子有母亲的主键作为外键.母亲与孩子的关系就是一对多 ...

随机推荐

  1. 十七、mysql 分区之 锁问题

    1.演示一个表锁,基于myisam CMD 1 CMD2 create table e1 (id int ,name char(20)); lock table e1 read; [select|in ...

  2. IOS成长之路-调用照相机和相册功能(转)

    转载自:http://blog.csdn.net/like7xiaoben/article/details/8465237 //先设定sourceType为相机,然后判断相机是否可用(ipod)没相机 ...

  3. OData 集成

    OData 集成 文档目录 本节内容: 简介 安装 安装Nuget包 设置模块依赖 配置你的实体 创建控制器 示例 获取实体列表 请求 响应 获取单个实体 请求 响应 获取单个实体及导航属性 请求 响 ...

  4. Telerik 控件事例(鼠标拖动行,拖动列,设置行对齐,行宽,是否显示)

    People.cs using System;using System.Collections.Generic;using System.Data;using System.Linq;using Sy ...

  5. Linux与Windows中动态链接库的分析与对比

    摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理.但不同操作系 ...

  6. tcpprep 对IPV6的支持

    在采用tcpreplay对包实施回放前,需要对包执行预处理,tcpprep就是完成这个任务的.tcpprep要做的处理就是生成一个cache文件,根据tcpprep wiki的介绍http://tcp ...

  7. spoj 237

    好牛的题  哈哈 #include <cstdio> #include <algorithm> #define S(n) scanf("%d",&n ...

  8. DIY Ruby CPU 分析 Part II

    [编者按]作者 Emil Soman,Rubyist,除此之外竟然同时也是艺术家,吉他手,Garden City RubyConf 组织者.本文是 DIY Ruby CPU Profiling 的第二 ...

  9. python:UnicodeEncodeError

    problem: (<type 'exceptions.UnicodeEncodeError'>, UnicodeEncodeError('ascii', u'[taobao_cocobe ...

  10. 一分钟明白 VS manifest 原理

    什么是vs 程序的manifest文件 manifest 是VS程序用来标明所依赖的side-by-side组建,如ATL, CRT等的清单. 为什么要有manifest文件 一台pc上,用一组建往往 ...