@OneToMany标记用于标注实体关系为一对多。在实体CustomerEO与实体AddressEO的关系是一对多的关系。注释@OneToMany的定义的代码如下所示。
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OneToMany {
Class targetEntity() default void.class;
CascadeType[] cascade() default {};
FetchType fetch() default LAZY;
String mappedBy() default "";
}
在使用此@OneToMany标记时,需要注意以下几个问题。
l targetEntity属性表示默认关联的实体类型。因为一对多的实体集合时保存在集合类中,所以必须指明集合类中保存的具体类型。以下两种方案必须任选一种。
(1)指定集合泛型的具体类型,如以上例中的代码所示。
private Collection<AddressEO> addresses = new ArrayList<AddressEO>();
@OneToMany(cascade = { CascadeType.ALL })
@JoinColumn(name = "customer_id")
public Collection<AddressEO> getAddresses() {
return addresses;
}
(2)指定targetEntity属性类型,如下代码所示。
private Collection addresses = new ArrayList();
@OneToMany(targetEntity=AddressEO.class,cascade = { CascadeType.ALL })
@JoinColumn(name = "customer_id")
public Collection getAddresses() {
return addresses;
}
l cascade属性和fetch属性所表示的意义与@OneToOne标记中类似,请读者参阅@OneToOne的属性说明。但要注意的是,@OneToMany中fetch属性默认为惰性加载LAZY的,这是因为集合类如果使用即时加载的话,会浪费很多资源。所以一般建议使用惰性加载。
l mappedBy属性用于标记当实体间的关系是双向时使用,在本章的6.5.2小节中将会详细讲述。