以上配置的映射,只能通过实体CustomerEO对象获得AddressEO对象,是单向关联。若要使AddressEO对象获得CustomerEO对象,需要在AddressEO中增加对CustomerEO对象的引用。修改后的AddressEO类图如图所示。
双向关联后AddressEO 实体的代码如下所示。
@Entity
@Table(name = "address")
public class AddressEO implements java.io.Serializable {
……
private CustomerEO customer;
@OneToOne(mappedBy = "address")
public CustomerEO getCustomer() {
return customer;
}
public void setCustomer(CustomerEO customer) {
this.customer = customer;
}
}
其中,CustomerEO属性也要使用@OneToOne标记,并且使用mappedBy属性来指明所映射的实体关系,它的值为所关联实体中该属性的名称。
例如本例中mappedBy = "address",address作为CustomerEO实体中的属性存在,如下代码中加粗的所示。
@Entity
@Table(name = "customer")
public class CustomerEO implements java.io.Serializable {
private AddressEO address;
@OneToOne(cascade = { CascadeType.ALL })
@JoinColumn(name="address_id")
public AddressEO getAddress() {
return address;
}
}
这样配置后,不仅通过CustomerEO实体能够获得AddressEO实体,也能够通过AddressEO获得CustomerEO实体。如下代码所示。
//通过CustomerEO获得AddressEO
Integer custId = new Integer(1);
CustomerEO customer = entityManager.find( CustomerEO.class, custId);
AddressEO address = customer.getAddress();
//通过AddressEO获得对应CustomerEO
Integer addrId = new Integer(1);
AddressEO address = entityManager.find( AddressEO.class, addrId);
CustomerEO customer = address.getCustomer();