Presentation is loading. Please wait.

Presentation is loading. Please wait.

第10章 面向对象分析设计与对象模型 面向对象方法中,从分析到设计不像传统方法那样有明显的方法、工具的转换,而是平滑(无缝)过渡。分析设计过程具有良好的可跟踪、可修改和可扩展性。 面向对象设计是面向对象分析到实现的一个桥梁。面向对象分析是将用户需求经过分析后,建立问题域精确模型的过程,而面向对象设计则是根据面向对象分析得到的需求模型,建立求解域模型的过程。

Similar presentations


Presentation on theme: "第10章 面向对象分析设计与对象模型 面向对象方法中,从分析到设计不像传统方法那样有明显的方法、工具的转换,而是平滑(无缝)过渡。分析设计过程具有良好的可跟踪、可修改和可扩展性。 面向对象设计是面向对象分析到实现的一个桥梁。面向对象分析是将用户需求经过分析后,建立问题域精确模型的过程,而面向对象设计则是根据面向对象分析得到的需求模型,建立求解域模型的过程。"— Presentation transcript:

1 第10章 面向对象分析设计与对象模型 面向对象方法中,从分析到设计不像传统方法那样有明显的方法、工具的转换,而是平滑(无缝)过渡。分析设计过程具有良好的可跟踪、可修改和可扩展性。 面向对象设计是面向对象分析到实现的一个桥梁。面向对象分析是将用户需求经过分析后,建立问题域精确模型的过程,而面向对象设计则是根据面向对象分析得到的需求模型,建立求解域模型的过程。

2 类和对象

3 类图 类图的概念 类图的元素 接口 类之间的关系

4 类图的概念 描述类、接口及它们之间关系的图 显示系统中各个类的静态结构

5 类图的元素 类(Class) 接口(Interface) 依赖关系(Dependency) 泛化关系(Generalization)
关联关系(Association) 实现关系(Realization)

6 类 面向对象系统组织结构的核心 对一组具有相同属性、操作、关系和语义的对象的抽象
包括名称部分(Name)、属性部分(Attribute)和操作部分(Operation)

7 类的组成 名称 属性 操作 职责 约束 注释

8 名称 应该来自系统的问题域 应该是一个名词,且不应该有前缀或后缀 分为简单名称和路径名称

9 属性 描述了类在软件系统中代表的事物(即对象)所具备的特性 类可以有任意数目的属性,也可以没有属性 在 UML 中,类属性的语法为

10 属性的组成 可见性 属性名 类型 初始值 属性字符串

11 类 属性的可见性 公有(Public) “+” 私有(Private)“-” 受保护(Protected)“#” 属性名
每个属性都必须有一个名字以区别于类中的其他属性 属性名由描述所属类的特性的名词或名词短语组成 单字属性名小写,如果属性名包含了多个单词,这些单词要合并,且除了第一个单词外其余单词的首字母要大写

12 类 属性的类型 简单类型 整型 布尔型 实型 枚举类型 …… 系统中的其他类 属性的初始值
保护系统的完整性,防止漏掉取值或被非法的值破坏系统的完整性 为用户提供易用性

13 属性字符串 指定关于属性的其他信息 任何希望添加在属性定义字符串值但又没有合适地方可以加入的规则,都可以放在属性字符串里

14 类 操作 对类的对象所能做的事务的抽象 一个类可以有任意数量的操作或者根本没有操作 返回类型、名称和参数一起被称为操作签名
在 UML 中,类操作的语法为

15 操作的组成 可见性 操作名 参数表 返回类型 属性字符串

16 类 操作的可见性 操作名 公有(Public) “+” 私有(Private) “-” 受保护(Protected) “#”
包内公有(Package) “~” 操作名 用来描述所属类的行为的动词或动词短语 单字操作名小写,如果操作名包含了多个单词,这些单词要合并,并且除了第一个单词外其余单词的首字母要大写

17 类 操作的参数表 操作的返回类型 一些按顺序排列的属性定义了操作的输入 是可选的,即操作不一定必须有参数才行 定义方式:“名称:类型”
若存在多个参数,将各个参数用逗号隔开 参数可以具有默认值 操作的返回类型 是可选的,即操作不一定必须有返回类型 绝大部分编程语言只支持一个返回值 具体的编程语言一般要加一个关键字 void 来表示无返回值

18 属性字符串 在操作的定义中加入一些除了预定义元素之外的信息

19 职责 类或其他元素的契约或义务 自由形式的文本 非形式化的方法

20 约束 指定了类所要满足的一个或多个规则 形式化的方法 在 UML 中,约束是一个用花括号括起来的自由文本

21 注释 注释可以包含图形也可以包含文本

22 接口 在没有给出对象的实现和状态的情况下对对象行为的描述 包含操作但不包含属性 没有对外界可见的关联 一个类可以实现一个或多个接口

23 类之间的关系 依赖关系 泛化关系 关联关系 实现关系

24 依赖关系 依赖关系 表示两个或多个模型元素之间语义上的关系 客户以某种形式依赖于提供者

25 依赖关系 依赖关系的分类 使用依赖(Usage) 抽象依赖(Abstraction) 授权依赖(Permission)
绑定依赖(Binding)

26 依赖关系 使用依赖 表示客户使用提供者提供的服务以实现它的行为 使用依赖具体包括 使用(《use》) 调用(《call》)
声明一个类调用其他类的操作的方法 参数(《parameter》) 声明一个操作和它的参数之间的关系 发送(《send》) 声明信号发送者和信号接收者之间的关系 实例化(《instantiate》) 声明用一个类的方法创建了另一个类的实例

27 依赖关系 抽象依赖 表示客户与提供者之间的关系,依赖于在不同抽象层次上的事物,包括 跟踪(《trace》) 精化(《refine》)
派生(《derive》)

28 依赖关系 授权依赖 表达一个事物访问另一个事物的能力,包括 访问(《access》) 导入(《import》) 友元(《friend》)
允许一个包访问另一个包的内容 导入(《import》) 允许一个包访问另一个包的内容并为被访问包的组成部分增加别名 友元(《friend》) 允许一个元素访问另一个元素,不管被访问的元素是否具有可见性

29 依赖关系 绑定依赖 较高级的依赖类型,用于绑定模板以创建新的模型元素,包括 绑定(《bind》)

30 依赖关系 类之间访问关系无需定义成属性。在A中访问B中的方法或属性,或者A负责实例化B。 BusinessService Customer

31 泛化关系 泛化关系 存在于一般元素和特殊元素间的分类关系 可以用于类、用例以及其他模型元素 描述了一种“is a kind of” 的关系

32 关联关系 关联关系 一种结构关系 指明事物的对象之间的联系

33 关联关系 关联关系 名称(Name) 角色(Role) 多重性(Multiplicity) 聚合关系(Aggregation)
组合关系(Composition) 导航性(Navigation)

34 关联关系 关联的名称 使用一个动词或动词短语来命名关联 清晰而简洁地说明对象间关系 关联的名称并不是必需的
可以前缀或后缀一个指引阅读方向的方向指示符,以消除歧义

35 关联关系 关联的角色 关联关系中一个类对另一个类所表现出来的职责 角色的名称应该是名词或名词短语,以解释对象是如何参与关系的

36 关联关系 关联的多重性 指有多少对象可以参与该关联 可以表达一个取值范围、特定值、无限定的范围或一组离散值
格式:“minimum..maximum” (均为Int型) 赋给一个端点的多重性表示该端点可以有多少个对象与另一个端点的一个对象关联

37 关联关系 类间的引用关系。以属性定义的方式表现 关联可分为一对一、一对多和多对多。 还可分为单向关联和双向关联。 Order
Customer 关联可分为一对一、一对多和多对多。 还可分为单向关联和双向关联。

38 双向关联:既建立从Order到Customer的多对一关联,又建立从Customer到Order的一对多关联。
单向关联:仅仅建立从Order到Customer的多对一关联,即仅仅在Order类中定义customer属性。或者仅仅建立从Customer到Order的一对多关联,即仅仅在Customer类中定义orders集合。 双向关联:既建立从Order到Customer的多对一关联,又建立从Customer到Order的一对多关联。 单向多对一 双向多对一 单向一对多

39 聚合关系 聚合关系 一种特殊类型的关联 表示整体与部分关系的关联 描述了“has a”的关系

40 组成关系 组成关系 聚合关系中的一种特殊情况,是更强形式的聚合,又称强聚合 成员对象的生命周期取决于聚合的生命周期
聚合不仅控制着成员对象的行为,而且控制着成员对象的创建和解构

41 聚合关系 类间的引用关系以属性定义为对象集合的方式表现 Person hand:set Hand ……

42 实现关系 实现关系 规格说明和其实现之间的关系 客户必须至少支持提供者的所有操作 泛化和实现都可以将一般描述与具体描述联系起来
泛化将同一语义层上的元素连接起来,并且通常在同一模型内 实现将不同语义层内的元素连接起来,并且通常建立在不同的模型内

43 分析模型 边界类 控制类 实体类

44 图书馆管理系统的类图 Interface 包中的类

45 图书馆管理系统的类图 Application 包中的类

46 图书馆管理系统的类图 Database 包中的类

47 设计模型 概要类图 详细类图 删除 修改 添加

48 建立完整的类图(详细类图) 将消息映射成操作 分解概念模糊的类 更新时序图和协作图

49 将消息映射成操作 根据时序图或协作图消息确定类中的方法 手动为类添加属性和其他方法

50 图书馆管理系统的类图 Application 的包类图

51 图书馆管理系统的类图 Database 包的类图

52 分解概念模糊的类 将接口包中 Maintain Window 分解 Admin Window Librarian Window

53 更新时序图和协作图 更新后的借书时序图

54 抽象类和接口设计原则 1、缺省抽象原则 2、接口设计原则 3、黑盒原则 4、不具体化超类原则

55 缺省抽象原则DAP 纯抽象的接口和具体实现类之间插入一个抽象类,将一些与子类无关、可以实现的操作接口进行实现。这个抽象类实现了接口的大部分操作,只留下一些和子类相关的操作到子类实现。 变化和不变部分分离。

56 接口设计原则IDP 规划接口,不需考虑接口的实现。 接口提供操作集合(视图):定义类的使用接口或使用视图 核心:抽象操作 外部接口和内部实现隔离。 面向接口编程 List list=new ArrayList List list=new LinkedList

57 黑盒原则BBP 核心:类的封装。 尽可能使用类的聚合,少用继承。 点类定义直线类: Class Point{double x,y;} 继承: Class Line extends Point{ double x1,y1;} 聚合: Class Line {Point p1,p2;}

58 不具体化超类原则DCSP 核心:超类抽象,应只实现公共方法。其他由子类实现(定义为抽象方 法) 延迟子类实现方法。 abstract class Shape{ abstract public double getArea(); … }

59 面向对象设计原则(类图优化) 1、单一职责原则 2、开闭原则 3、替换原则 4、依赖倒置原则 5、接口分离原则

60 单一职责原则SRP 类的责任单一,高内聚。 核心:分离。实体类中的处理逻辑分离到控制类。

61 开闭原则OCP 开放扩展,关闭修改。 修改类应用继承扩展类,而不是直接修改。 父类尽可能抽象或接口。
缺点:继承复杂化。继承结构一般不超过两层。 void draw(Shape s){ s.draw(); }

62 替换原则Liskov 不知道子类的情况下,使用父类构造对象。 替换原则Liskov:基类对象能够替换成子类型对象而功能不变
核心:抽象、多态性 动态联编实现构造对象方法。(根据对象类型选择子类相应的操作方法)

63 替换原则Liskov s.getArea() public class Shape{
double getArea(){return 0.0;} } public class Circle extends Shape{ double r; double getArea(){return Math.PI * r * r;} Shape s = new Circle() s.getArea()

64 替换原则Liskov Public class Cart{ List<Product> goods = new ArrayList<Product>(); new LinkedList<Product>(); public void add(Product p){ goods.add(p); } Public double totalMoney(){ double sum=0.0; for (Product product:goods) sum +=product.price; …

65 替换原则Liskov 优点: 良好的扩展性 对象多态性 实现契约编程 注意: 遵循开闭原则 使用中间接口层,低耦合 派生类可能存在退化函数 派生类可能抛异常

66 依赖倒置原则DIP 依赖于抽象,不依赖于具体(子类依赖于父类) 核心:接口编程 main() f1() f2() g1() g2()
Compoent Container Window Panel

67 依赖倒置原则DIP 设计之一----继承结构

68 依赖倒置原则DIP 设计之二----接口结构

69 接口分离原则ISP 不应将多个操作设计在一个接口中。 核心:不同用户的操作分离成多个接口,由同一个类实现

70 接口分离原则ISP interface Interface{ a(); b(); c(); } Class ClientA{ Interface i = new instance(); i.a();} Class ClientB{ i.b();} Class ClientC{ i.c();}

71 接口分离原则ISP 优化 interface InterfaceA{ a();} interface InterfaceB{ b();} interface InterfaceC{ c();} Class ClientA{ InterfaceA i = new instance(); i.a();} Class ClientB{ InterfaceB i = new instance(); i.b();} Class ClientC{ InterfaceC i = new instance(); i.c();}

72 面向对象设计原则(类图优化) 1、面向接口编程 2、使用组合,不用继承 3、用继承,使用抽象类 4、重用或契约

73 对象-关系映射ORM 面向对象概念 面向关系概念 类 表 对象 表的行(记录) 属性 表的列(字段) 关系数据模型 域模型 Address类
Province city street zipcode Customer类 id name homeAddress comAddress Customer表 ID …… HOME_PROVINCE HOME_CITY COM_PROVINCE COM_CITY 注:域模型中类的数目要比关系数据模型中 表的数目多。

74 ORM 充当业务逻辑层和数据库层之间的桥梁
域模型 (对象、属性、关联、继承和多态) 业务逻辑层 对象-关系映射文件 (xml) ORM API ORM 实现 参照 持久化层 关系数据模型 (表、字段、索引、主键和外键) 数据库层 ORM 充当业务逻辑层和数据库层之间的桥梁

75 对象模型与关系模型转换 1、对象模型向关系模型转换 对象转换成实体,属性转换成非键属性,自动增加主键属性。类型根据数据库支持类型。
对象之间的关系转换成实体的关系,其中泛化和组成转换成标定性关系,关联和聚集转换成非标定性关系。

76 对象模型与关系模型转换 2、关系模型向对象模型转换 实体转换成对象,属性转换成对象属性,自增主键属性不转换。类型根据对象语言支持类型。
实体之间的关系转换成对象关系,其中标定性关系转换成组成关系,非标定性关系转换成关联和聚集关系。 父子关系转换成泛化继承关系。

77 Hibernate Customer类 BusinessService类 Customers表 Hibernate API 对象关系型映射
关系数据库 Customers表

78 创建持久化类 public class Customer implements Serializable {
private static final long serialVersionUID = L; private Long id; private String name; private String ; public Customer() { } public Long getId() { return id; public void setId(Long id) { this.id = id; public String getName() { return name;

79 创建表 create table CUSTOMER( ID Integer primary key,
NAME varchar2(15) not null, varchar2(128) not null, PASSWORD varchar2(8) not null, PHONE varchar2(20), ADDRESS varchar2(255), SEX char(2), IS_MARRIED char(1), DESCRIPTION clob, IMAGE blob, BIRTHDAY date, REGISTERED_TIME timestamp );

80 创建对象-关系映射文件 <hibernate-mapping>
<class name="mypack.Customer" table="CUSTOMERS"> <!--id 主键 --> <id name="id" column="ID" type="long"> <generator class="increment" /> </id> <!-- 名称 --> <property name="name" column="NAME" type="string" not-null="true" /> …… </class> </hibernate-mapping>

81 持久化类映射到表 <class>:类和表的映射 <class name="mypack.Customer“
table="CUSTOMERS"> <id>:持久化类的OID和表主键映射 <id name="id" column="ID" type="long"> <generator class="increment" /> </id> <property> <property name=" " column=" " type="string" not-null="true" />

82 java、hibernate、sql类型对应关系
Customer类属性 java hibernate Cutomers字段名 Sql类型 Name java.lang.String string NAME Varchar(15) Phone int PHONE INT Sex char character SEX CHAR(1) Married boolean IS_MARRIED BIT Description text DESCRIPTION CLOB image byte[] binary IMAGE BLOB birthday java.sql.Date date BIRTHDAY DATE registeredTime java.sql.TimeStamp timestamp REGISTERED_TIME TIMESTAMP

83 通过API操作数据库

84 通过API操作数据库

85 数据类型 Java数据类型 Hibernate数据类型 标准SQL数据类型 对于不同的DB可能有所差异)
byte、java.lang.Byte byte TINYINT short、java.lang.Short short SMALLINT int、java.lang.Integer integer INGEGER long、java.lang.Long long BIGINT float、java.lang.Float float FLOAT double、java.lang.Double double DOUBLE java.math.BigDecimal big_decimal NUMERIC char、java.lang.Character character CHAR(1) boolean、java.lang.Boolean boolean BIT java.lang.String string VARCHAR yes_no CHAR(1)('Y'或'N') true_false java.util.Date、java.sql.Date date DATE java.util.Date、java.sql.Time time TIME

86 数据类型 Java数据类型 Hibernate数据类型 标准SQL数据类型 对于不同的DB可能有所差异)
java.util.Date、java.sql.Timestamp timestamp TIMESTAMP java.util.Calendar calendar calendar_date DATE byte[] binary VARBINARY、BLOB java.lang.String text CLOB java.io.Serializable serializable java.sql.Clob clob java.sql.Blob blob BLOB java.lang.Class class VARCHAR java.util.Locale locale java.util.TimeZone timezone java.util.Currency currency

87 ORM映射一对多关联关系 Order到Customer的多对一单向关联 Customer 到Order的一对多单向关联

88 ORM映射一对多关联关系 建立多对一的单向关联关系 <many-to-one name=“customer”
column=“CUSTOMER_ID” class=“..Customer” not-null=“true”> <property name=“***”> ?

89 ORM映射一对多关联关系 建立多对一的单向关联关系(续) many-to-one属性: name:设定待映射的持久化类的属性名。
column:设定和持久化类的属性对应的表的外键。 class:设定持久化类的属性的类型。 not-null:属性是否允许为空。默认值是false表示可以为空。

90 ORM映射一对多关联关系 tx = session.beginTransaction();
Customer c = new Customer(); c.setName("TOM"); session.save(c); ?会有什么后果 Order o1 = new Order(); o1.setOrderNumber("1"); o1.setCustomer(c); Order o2 = new Order(); o2.setOrderNumber("1"); o2.setCustomer(c); session.save(o1); session.save(o2); tx.commit();

91 ORM映射一对多关联关系 建立多对一的单向关联关系 <many-to-one>not-null属性
tx = session.beginTransaction(); Customer c = new Customer(); c.setName("TOM"); //session.save(c); ?会有什么后果 Order o1 = new Order(); o1.setOrderNumber("1"); o1.setCustomer(c); Order o2 = new Order(); o2.setOrderNumber("1"); o2.setCustomer(c); session.save(o1); session.save(o2); tx.commit();

92 ORM映射一对多关联关系 建立多对一的单向关联关系 级联保存和更新
当hibernate持久化一个临时对象时,在默认情况下,他不会自动持久化所关联的其他临时对象,会抛出TransientObjectException.如果设定many-to-one元素的cascade属性为save-update的话,可实现自动持久化所关联的对象。 <many-to-one name=“customer” column=“CUSTOMER_ID” class=“..Customer” cascade=“save-update” not-null=“true” /> <property name=“***”> ?

93 ORM映射一对多关联关系 映射一对多双向关联关系 Class Customer{ …
public Set orders = new Set(); public Set getOrders(){ return orders; } public void setOrders(Set orders){ this.orders = orders; <set name=“orders” cascade=“save-update”> <key column=“CUSTOMER_ID” /> <one-to-many class=“..Order” /> </set> Customer c = new Customer(“TOM”); Order o1 = new Order(“11”); O1.setCustomer(c); c.getOrders().add(o1); session.save(c); tx.commit();

94 ORM映射一对多关联关系 映射一对多双向关联关系(续)
Hibernate要求在持久化类中定义集合属性时,必须把属性声明为接口类型,如Set、Map、List.声明为接口类型可提高持久化类的透明性,当hibernate调用setOrders()方法时,传递的参数是Hibernate自定义的实现该接口类的实例。如果定义成类(如HashSet)型,强迫hibernate把该类型的实例传给他。 通常在定义集合属性时,直接初始化为一个实现类的实例。 private Set orders = new HashSet(); 可避免空指针异常。

95 ORM映射一对多关联关系 映射一对多双向关联关系(续) <set name=“orders”
cascade=“save-update”> <key column=“CUSTOMER_ID” /> <one-to-many class=“..Order” /> </set> Set:表示待映射持久化类属性类型为java.util.Set name:设定待映射持久化类的属性名。 cascade:设定级联操作的程度。 key子属性:设定与所关联的持久化类对应的外键。此例表明Orders 表通过外键customer_ID参照Customers表。 one-to-many子属性:设定所关联的持久化类。此例表明order集合中存放 的是一组Order对象。

96 映射一对多关联关系 <set>元素的inverse属性 映射一对多双向关联关系
Customer c = (Customer)session .load(Customer.class,new Long(2)); Order o = (Order)session.load(Order.class,new Long(2)); o.setCustomer(c); c.getOrders().add(o); tx.commit(); Update orders set …... Update orders set …… hibernate执行两条更新语句。

97 ORM映射一对多关联关系 映射一对多双向关联关系 <set>元素的inverse属性(续)
Hibernate会自动清理缓存中的所有持久化对象,按照持久化对象的改变 来同步更新数据库,因此执行了上述的两条更新语句。 重复执行多余的sql语句会影响java性能,解决这问题的办法是把<set> 元素的inverse属性设为true,该属性的默认值是false。 <set name=“orders” cascade=“save-update” inverse=“true”> <key column=“CUSTOMER_ID” /> <one-to-many class=“mypack.Order” /> </set> Customer和order的双向关联中,customer端的关联只是order端关联 的镜像。当hibernate同时探测到持久化对象customer和order的状态均 发生变化时,仅按照order对象状态更新数据库。

98 ORM映射一对多关联关系 映射一对多双向关联关系 <set>元素的inverse属性(续)
Customer c = (Customer)session.load(…)); Order o = (Order)session.load(…); o.setCustomer(c); //c.getOrders().add(c); tx.commit(); 以上代码仅设置了order对象的customer属性,hibernate仍然会按照 order对象的状态 的变化来同步更新数据库,执行以下sql语句: Update orders set order_number=‘…’,customer_id=2 where id = 2

99 ORM映射一对多关联关系 映射一对多双向关联关系 <set>元素的inverse属性(续)
Customer c = (Customer)session.load(……); Order o = (Order)session.load(……); //o.setCustomer(c); c.getOrders().add(o); tx.commit(); 以上代码仅设置了customer对象的orders属性,由于<set>元素的 inverse属性为true,因此,hibernate不会按照customer对象的状态 变化来同步更新数据库。

100 ORM映射一对多关联关系 映射一对多双向关联关系 <set>元素的inverse属性 结论:
1.在映射一对多的双向关联关系时,应该在one方把inverse 属性设为true,这可以提高性能。 2.在建立两个对象的关联时,应该同时修改关联两端的相应 属性: Customer.getOrders().add(order); Order.setCustomer(customer); 这样才会使程序更加健壮,提高业务逻辑层的独立性,使业务 逻辑层的程序代码不受Hibernate实现类的影响。同理,当删 除双向关联的关系时,也应该修改关联两端的对象的相应属性: Customer.getOrders().remove(order); Order.setCustomer(null);

101 ORM映射一对多关联关系 映射一对多双向关联关系 级联删除
Customer customer = (Customer)session.load(Customer.class,new Long(2)); Session.delete(customer); tx.commit(); 如果cascade属性取默认值none,不会自动删除和customer关联的其他持久化对象。如 果希望删除customer时,自动删除和customer关联的order对象,可把cascade属性设 为delete。 <set name=“orders” cascade=“delete” inverse=“true”> <key column=“CUSTOMER_ID” /> <one-to-many class=“mypack.Order” /> </set> 再运行删除方法的时候,会自动删除order对象,此时hibernate执行如下语句: Delete from customer where customer_id = 1; Delete customer where id = 1;

102 ORM映射一对多关联关系 映射一对多双向关联关系 父子关系 //加载Customer对象
Customer customer = (Customer)session.loadCustomer.class,new Long(2)); //获得与Customer对象关联的一个Order对象的引用 Order order = (Order)customer.getOrders().iterator().next(); //删除关联关系 customer.getOrders().remove(order); order.setCustomer(null); tx.commit(); 如果cascade为默认值none,hibernate会执行如下语句: Update orders set Customer_id = null where ID = 2; 如果希望hibernate程序自动删除不再和customer关联的order对象,可以把cascade属性设为 all-delete-orphan。 <set name=“orders” cacade=“add-delete-orphan” inverse=“true”> <key column=“CUSTOMER_ID” /> <one-to-many class=“mypack.Order” /> </set> Delete from orders where CUSTOMER_ID = 2 and ID = 2

103 ORM映射一对多关联关系 映射一对多双向关联关系 父子关系
当customer.hbm.xml的<set>元素的cascade属性取值为 all-delete-orphan,Hibernate会按照如下方式处理customer对象: 1.当保存或更新customer对象时,级联保存或更新所有关联的order 对象,相当于save-update. 2.当删除customer对象时,级联删除所有的order对象,相当于delete。 3.删除不再和customer对象关联的所有order对象。 当关联双方存在父子关系时,就可以把父方的cascade属性设为 all-delete-orphan. 所谓父子关系:是指父方来控制子方的持久化生命周期,子方对象必 须和一个父方对象关联。


Download ppt "第10章 面向对象分析设计与对象模型 面向对象方法中,从分析到设计不像传统方法那样有明显的方法、工具的转换,而是平滑(无缝)过渡。分析设计过程具有良好的可跟踪、可修改和可扩展性。 面向对象设计是面向对象分析到实现的一个桥梁。面向对象分析是将用户需求经过分析后,建立问题域精确模型的过程,而面向对象设计则是根据面向对象分析得到的需求模型,建立求解域模型的过程。"

Similar presentations


Ads by Google