对于一对一关系的表,还可以使用另一种策略来保存表与表之间的关系,这就是主键关联。主键关联是通过两个表中的主键来关联,下面举个具体的例子来说明。
例如同样是customer表和address表,表结构修改后SQL语句如下所示。
--客户表
CREATE TABLE customer (
id int(20) NOT NULL auto_increment,
name varchar(100) ,
PRIMARY KEY (id)
)
--地址表
CREATE TABLE address (
id int(20) NOT NULL auto_increment,
province varchar(50) ,
city varchar(50) ,
postcode varchar(50) ,
detail varchar(50) ,
PRIMARY KEY (id)
)
这样表结构修改后,两个表之间的关联通过主键来关联,如图所示。
此时,CustomerEO中映射的配置的代码如下所示。
@Entity
@Table(name = "customer")
public class CustomerEO implements java.io.Serializable {
……
private AddressEO address;
@OneToOne(cascade = { CascadeType.ALL })
@PrimaryKeyJoinColumn
public AddressEO getAddress() {
return address;
}
public void setAddress(AddressEO address) {
this.address = address;
}
若AddressEO与CustomerEO双向关联,则应该修改AddressEO的代码如下:
@Entity
@Table(name = "address")
public class AddressEO implements java.io.Serializable {
……
private CustomerEO customer;
@OneToOne
@PrimaryKeyJoinColumn
public CustomerEO getCustomer() {
return customer;
}
public void setCustomer(CustomerEO customer) {
this.customer = customer;
}
}
两个实体通过主键关联要使用@PrimaryKeyJoinColumn注释,它的定义如下代码所示。
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
public @interface PrimaryKeyJoinColumn {
String name() default "";
String referencedColumnName() default "";
String columnDefinition() default "";
}
它的属性与@JoinColumn属性类似,说明如下。
l name属性标识所在实体的表中关联字段的名称。
l referencedColumnName属性标识为所关联的的表中字段名称。
提示:@PrimaryKeyJoinColumn不仅可以与@OneToOne注释使用,还可以与其他标记同时使用,但所表示的含义不同,这些内容将在下文讲述。