Hibernate关联关系映射探究(1-3)

Association Mappings

 

1. Introduction

Association mappings are the often most difficult thing to get right. In this section we'll go through the canonical cases one by one, starting with unidirectional mappings, and then considering the bidirectional cases. We'll use Personand Addressin all the examples.

We'll classify associations by whether or not they map to an intervening join table, and by multiplicity.

Nullable foreign keys are not considered good practice in traditional data modelling, so all our examples use not null foreign keys. This is not a requirement of Hibernate, and the mappings will all work if you drop the nullability constraints.

2. Unidirectional associations

2.1. many to one

A unidirectional many-to-one association is the most common kind of unidirectional association.

xml代码
  1. < class   name = "Person" >   
  2.   < id   name = "id"   column = "personId" >   
  3.      < generator   class = "native" />   
  4.   id >   
  5.   < many-to-one   name = "address"   
  6.       column = "addressId"   
  7.       not-null = "true" />   
  8. class >   
  9. < class   name = "Address" >   
  10.   < id   name = "id"   column = "addressId" >   
  11.       < generator   class = "native" />   
  12.   id >   
  13. class >   

sql 代码

  1. create   table  Person ( personId  bigint   not   null   primary   key , addressId  bigint   not   null  )  
  2. create   table  Address ( addressId  bigint   not   null   primary   key  )   
 

2.2. one to one

A unidirectional one-to-one association on a foreign key is almost identical. The only difference is the column unique constraint.

 

xml 代码
  1. < class   name = "Person" >   
  2.      < id   name = "id"   column = "personId" >   
  3.            < generator   class = "native" />   
  4.      id >   
  5.      < many-to-one   name = "address"   
  6.             column = "addressId"   
  7.             unique = "true"   
  8.             not-null = "true" />   
  9. class >   
  10.   
  11. < class   name = "Address" >   
  12.       < id   name = "id"   column = "addressId" >   
  13.                  < generator   class = "native" />   
  14.       id >   
  15. class >   
sql 代码
  1. create   table  Person ( personId  bigint   not   null   primary   key , addressId  bigint   not   null   unique  )  
  2. create   table  Address ( addressId  bigint   not   null   primary   key  )  

A unidirectional one-to-one association on a primary key usually uses a special id generator. (Notice that we've reversed the direction of the association in this example.)

xml 代码
  1. < class   name = "Person" >   
  2.           < id   name = "id"   column = "personId" >   
  3.                < generator   class = "native" />   
  4.           id >   
  5. class >   
  6. < class   name = "Address" >   
  7.             < id   name = "id"   column = "personId" >   
  8.                      < generator   class = "foreign" >   
  9.                            < param   name = "property" > person param >   
  10.                      generator >   
  11.              id >   
  12. < one-to-one   name = "person"   constrained = "true" />   
  13. class >   
sql 代码
  1. create   table  Person ( personId  bigint   not   null   primary   key  )   
  2. create   table  Address ( personId  bigint   not   null   primary   key  )  

2.3. one to many

A unidirectional one-to-many association on a foreign key is a very unusual case, and is not really recommended.

 

xml 代码
  1. < class   name = "Person" >   
  2.       < id   name = "id"   column = "personId" >   
  3.           < generator   class = "native" />   
  4.       id >   
  5.       < set   name = "addresses" >   
  6.           < key   column = "personId"   
  7.                 not-null = "true" />   
  8.           < one-to-many   class = "Address" />   
  9.       set >   
  10. class >   
  11. < class   name = "Address" >   
  12.       < id   name = "id"   column = "addressId" >   
  13.            < generator   class = "native" />   
  14.       id >   
  15. class >   
sql 代码
  1. create   table  Person ( personId  bigint   not   null   primary   key  )   
  2. create   table  Address ( addressId  bigint   not   null   primary   key , personId  bigint   not   null  )   

We think it's better to use a join table for this kind of association.

<o:p>  </o:p>

3. Unidirectional associations with join tables

3.1. one to many

A unidirectional one-to-many association on a join table is much preferred. Notice that by specifying unique="true", we have changed the multiplicity from many-to-many to one-to-many.

xml 代码
  1. < class   name = "Person" >   
  2.         < id   name = "id"   column = "personId" >   
  3.                < generator   class = "native" />   
  4.         id >   
  5.         < set   name = "addresses"   table = "PersonAddress" >   
  6.                < key   column = "personId" />   
  7.                < many-to-many   column = "addressId"   
  8.                         unique = "true"   
  9.                        class = "Address" />   
  10.         set >   
  11. class >   
  12. < class   name = "Address" >   
  13.       < id   name = "id"   column = "addressId" >   
  14.                 < generator   class = "native" />   
  15.       id >   
  16. class >   
sql 代码
  1. create   table  Person ( personId  bigint   not   null   primary   key  )   
  2. create   table  PersonAddress ( personId  not   null , addressId  bigint   not   null   primary   key  )  

       create table Address ( addressId bigint not null primary key )

3.2. many to one

A unidirectional many-to-one association on a join table is quite common when the association is optional.

xml 代码
  1. < class   name = "Person" >   
  2.        < id   name = "id"   column = "personId" >   
  3.            < generator   class = "native" />   
  4.        id >   
  5.        < join   table = "PersonAddress"   
  6.            optional = "true" >   
  7.            < key   column = "personId"   unique = "true" />   
  8.            < many-to-one   name = "address"   
  9.                  column = "addressId"   
  10.                  not-null = "true" />   
  11.         join >   
  12. class >   
  13. < class   name = "Address" >   
  14.           < id   name = "id"   column = "addressId" >   
  15.                      < generator   class = "native" />   
  16.           id >   
  17. class >   
sql 代码
  1. create   table  Person ( personId  bigint   not   null   primary   key  )   
  2. create   table  PersonAddress ( personId  bigint   not   null   primary   key , addressId  bigint   not   null  )   
  3. create   table  Address ( addressId  bigint   not   null   primary   key  )  

3.3. one to one

A unidirectional one-to-one association on a join table is extremely unusual, but possible.

xml 代码
  1. < class   name = "Person" >   
  2.           < id   name = "id"   column = "personId" >   
  3.                       < generator   class = "native" />   
  4.            id >   
  5.            < join   table = "PersonAddress"   optional = "true" >   
  6.                        < key   column = "personId"   unique = "true" />   
  7.                        < many-to-one   name = "address"   
  8.                                  column = "addressId"   
  9.                                  not-null = "true"   
  10.                                  unique = "true" />   
  11.             join >   
  12. class >   
  13. < class   name = "Address" >   
  14.          < id   name = "id"   column = "addressId" >   
  15.                  < generator   class = "native" />   
  16.           id >   
  17. class >   
sql 代码
  1. create   table  Person ( personId  bigint   not   null   primary   key  )   
  2. create   table  PersonAddress ( personId  bigint   not   null   primary   key , addressId  bigint   not   null   unique  )  
  3. create   table  Address ( addressId  bigint   not   null   primary   key  )  

3.4. many to many

Finally, we have a unidirectional many-to-many association.

xml 代码
  1. < class   name = "Person" >   
  2.           < id   name = "id"   column = "personId" >   
  3.                    < generator   class = "native" />   
  4.            id >   
  5.            < set   name = "addresses"   table = "PersonAddress" >   
  6.                   < key   column = "personId" />   
  7.                   < many-to-many   column = "addressId"   class = "Address" />   
  8.            set >   
  9. class >   
  10. < class   name = "Address" >   
  11.            < id   name = "id"   column = "addressId" >   
  12.                    < generator   class = "native" />   
  13.             id >   
  14. class >   
sql 代码
  1. create   table  Person ( personId  bigint   not   null   primary   key  )   
  2. create   table  PersonAddress ( personId  bigint   not   null , addressId  bigint   not   null primary   key  (personId, addressId) )  
  3. create   table  Address ( addressId  bigint   not   null   primary   key  )  

你可能感兴趣的:(sql,Hibernate,xml,Go)