@OneToOne标记用于标注实体关系为一对一。在实体CustomerEO与实体AddressEO的关系是一对一的关系。注释@OneToOne的定义的代码如下所示。
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OneToOne {
Class targetEntity() default void.class;
CascadeType[] cascade() default {};
FetchType fetch() default EAGER;
boolean optional() default true;
String mappedBy() default "";
}
在使用此@OneToOne标记时,需要注意以下几个问题。
l targetEntity属性表示默认关联的实体类型,默认为当前标注的实体类。例如使用默认设置与以下所示的设置的效果相同。一般情况使用默认设置就可以了。
@OneToOne(targetEntity=AddressEO.class)
public AddressEO getAddress() {
return address;
}
l cascade属性表示与此实体一对一关联的实体的联级样式类型。联级样式是当对实体进行操作时策略,这部分内容将在本章的6.6小节中详细讲述,这里就不多做介绍了。默认情况下,不关联任何操作。
l fetch属性是该实体的加载方式,默认为及时加载EAGER,也可以使用惰性加载LAZY ,代码如下所示。
@OneToOne(fetch=FetchType.LAZY)
public AddressEO getAddress() {
return address;
}
l optional属性表示关联的该实体是否能够存在null值。默认为true,表示可以存在null值。如果设置为false,则该实体不能为null,并且要同时配合使用@JoinColumn标记,将保存实体关系的字段设置为唯一的、不为null并且不能更新的,代码如下所示。
@OneToOne(optional=false)
@JoinColumn(name = "address_id",unique=true, nullable=false, updatable=false)
public AddressEO getAddress() {
return address;
}
使用这样的映射后,一个CustomerEO实体必须对应一个AddressEO实体,也就是说表customer中,address_id字段必须有值,不能为空值。
l mappedBy属性用于双向关联实体时,标注在不保存关系的实体中。它的用法将在本章6.2.4双向关联的小节中详细讲述。