在学习中的笔记
7.3 使用连接表的单向关联(Unidirectional associations with join tables)
7.3.1 一对多 (one to many)
基于连接表的单向一对多关联应该优先被采用。请注意,通过指定unique="true",我们可以把多样性从多对多改变为一对多。
有三张表:
create table Person ( personId bigint not null primary key )
create table PersonAddress ( personId not null, addressId bigint not null primary key )
create table Address ( addressId bigint not null primary key )
hibernate的映射为:
<class name = "Person">
<id name = "id" column"personId">
<generator class = "native"/>
</id>
<set name = "addresses" table = "PersonAddress">
<key column = "personId"/>
<many-to-many column = "addressId" unique = "true" class = "Address"/>
</set>
</class>
<class name = "Address">
<id name = "id" column = "addressId">
<generator class = "native"/>
</id>
</class>
/**************************************************************************************/
7.3.2 多对一 (many to one)
基于连接表的单向多对一关联在关联关系可选的情况下应用也很普通。
关联表为:
create table Person ( personId bigint not null primary key )
create table PersonAddress ( personId bigint not null primary key, addressId bigint not null )
create table Address ( addressId bigint not null primary key )
hibernate的映射为:
<class name = "Person">
<id name = "id" column = "personId">
<generator class = "native"/>
</id>
<join table = "PersonAddress" optional = "true">
<key column = "personId" unique = "true"/>
<many-to-one name = "address" column = "addressId" not-null = "true"/>
</join>
</class>
<class name = "Address">
<id name = "id" column = "addressId">
<generator class = "native"/>
</id>
</class>
/**************************************************************************************/
7.3.3 一对一 (one to one)
基于连接表的单向一对一关联非常少见,但也是可行的。
表为:
create table Person ( personId bigint not null primary key )
create table PersonAddress ( personId bigint not null primary key, addressId bigint not null unique )
create table Address ( addressId bigint not null primary key )
hibernate的映射为:
<class name = "Person">
<id name = "id" column = "personId">
<generator class = "native"/>
</id>
<join table = "PersonAddress" optional = "true">
<key column = "personId" unique = "true"/>
<many-to-one name = "address" column = "addressId" not-null = "true" unique = "true"/>
</class>
<class name = "Address">
<id name = "id" column = "addressId">
<generator class = "native"/>
</id>
</class>
/**************************************************************************************/
7.3.4 多对多(many to many)
表位:
create table Person ( personId bigint not null primary key )
create table PersonAddress ( personId bigint not null, addressId bigint not null, primary key (personId, addressId) )
create table Address ( addressId bigint not null primary key )
最后,还有 单向多对多关联。
<class name = "Person">
<id name = "id" column = "personId">
<generator class = "native"/>
</id>
<set name = "addresses" table PersonAddress>
<key column = "personId"/>
<many-to-many column = "addressId" class = "Address"/>
</set>
</class>
<class>
<id name = "id" column = "addressId">
<generator class = "native"/>
</id>
</class>