关系映射annotation

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一对一(One-To-One)

使用@OneToOne注解建立实体Bean之间的一对一关联。一对一关联有三种情况:(1).关联的实体都共享同样的主键,(2).其中一个实体通过外键关联到另一个实体的主键(注意要模拟一对一关联必须在外键列上添加唯一约束),(3).通过关联表来保存两个实体之间的连接关系(要模拟一对一关联必须在每一个外键上

添加唯一约束)。

1.共享主键的一对一关联映射:

@Entity

@Table(name="Test_Body")

public class Body {

private Integer id;

private Heart heart;

@Id

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

@OneToOne

@PrimaryKeyJoinColumn

public Heart getHeart() {

return heart;

}

public void setHeart(Heart heart) {

this.heart = heart;

}

}

@Entity

@Table(name="Test_Heart")

public class Heart {

private Integer id;

@Id

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

}

通过@PrimaryKeyJoinColumn批注定义了一对一关联

2.使用外键进行实体一对一关联:

@Entity

@Table(name="Test_Trousers")

public class Trousers {

@Id

public Integer id;

@OneToOne

@JoinColumn(name = "zip_id")

public TrousersZip zip;

}

@Entity

@Table(name="Test_TrousersZip")

public class TrousersZip {

@Id

public Integer id;

@OneToOne(mappedBy = "zip")

public Trousers trousers;

}

上面的例子是指Trousers通过Trousers的外键列zip_id和TrousersZip关联,@JoinColumn批注定义了联接列,该批注和@Column批注有点类似,但是多了一个名为referencedColumnName的参数。该参数定义了所关联目标实体中的联接列,注意,当referencedColumnName关联到非主键列的时候,关联的目标类必须实现Serializable,还要注意的是所映像的属性对应单个列(否则映射无效)

一对一关联可能是双向的,在双向关联中,有且仅有一端作为主体(owner)端存在:主体端负责维护联接列(即更新),对于不需要维护这种关系的从表则通过mappedNy属性进行声明。mappedBy的值指向主体的关联属性。例子中,mappedBy的值为zip。最后,不必也不能再在被关联端(ownedside)定义联接列了,因为已经在主体端声明了。

如果在主体没有声明@JoinColumn,系统自动进行处理:在主表(owner table)中将创建联接列,列名为:主体的关联属性名+下划线+被关联端的主键列名。上面的例子中是zip_id,因为Trousers中的关联属性名为zip,TrousersZip的主键是id。

3.通过关联表定义一对一关联

@Entity

@Table(name="Test_People")

public class People {

@Id

public Integer id;

@OneToOne

@JoinTable(name ="TestPeoplePassports",

joinColumns=@JoinColumn(name="people_fk"),

inverseJoinColumns=@JoinColumn(name="passport_fk")

)

public Passport passport;

}

@Entity

@Table(name="Test_Passport")

public class Passport {

@Id

public Integer id;

@OneToOne(mappedBy = "passport")

public People people;

}

People通过名为TestPeoplePassports的关联表和Passport关联。该关联表拥有名为passport_fk的外键列,该外键指向Passport表,该信息定义为inverseJoinColoumns的属性值,而people_fk外键列指向People表,该信息定义为joinColumns的属性值。

这种关联可能是双向的,在双向关联中,有且仅有一端作为主体(owner)端存在:主体端负责维护联接列(即更新),对于不需要维护这种关系的从表则通过mappedNy属性进行声明。mappedBy的值指向主体的关联属性。例子中,

相关文档
最新文档