在一对多关联关系中什么时候应该使用级联的方式呢?
其实是否应该使用级联应该是个业务问题而不是个技术问题。
在一对多的级联中:
如果对象之间是组合关系,使用级联;
如果是聚合关系,不用级联.
首先简单说明一下组合和聚合的区别:
这两个词的来源是面向对象的分析与设计的技术中产生的。
当一个对象A是由多个其它对象(B,C,D...)组成的,如果当A不存在了,那么B,C,D...的存在就没有意义的情况下那么它们之间就是组合关系。
如果当A不存在了,B,C,D...单独存在也是有意义的情况下就是聚合关系。
下面来举一个一对多组合关系的例子,这个例子中是对JAVA文件的结构进行建模。如图所示:
某中sourceclass是java文件的信息。
sourcefield是java文件的信息。
sourcemethod是java文件的方法信息。
sourcemethodparameter是java文件的方法参数信息。
sourcemethodreturnvalue是java文件的方法返回值信息。
当一个java的文件被删除了,那么她所对应的属性信息,方法信息的存在就没有意义了。如果当删除java的文件信息的时候,没有删除她的属性信息和方法信息,那么就会留下很多的孤儿-垃圾数据。所以她们之间的关系就属于组合关系。在实体映射的时候,就应该把他们配置级联。
@Entity
@Table( uniqueConstraints = { @UniqueConstraint(columnNames = { "CLASSPACKAGE",
"NAME" }) })
public class SourceClass {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
// 类的包路径
private String classPackage = "";
// 类名称
private String name = "";
// 类描述
@Column(name="remark", length=1000)
private String remark = "";
// 类的字段
@OneToMany(mappedBy = "sourceClass",cascade=CascadeType.ALL)
private Collection<SourceField> fields = new HashSet<SourceField>();
// 类的方法集合
@OneToMany(mappedBy = "sourceClass",cascade=CascadeType.ALL)
private Collection<SourceMethod> methods = new HashSet<SourceMethod>();