hibernateオブジェクト関係マッピング(一対一,一対多,多対一,多対多の一方向,双方向マッピング)


オブジェクト間の関係:
リレーショナル・マッピング間の関係はオブジェクト間の関係のみであり、データベース・テーブルの関係(外部キー関係)を指すわけではありません.ここで解決される問題は、オブジェクト間の関係の一時、データベース・テーブルがどのようにマッピングされ、プログラミング上でどのように扱われるかです.
 
1対1(プライマリ・キーの関連付け、一方向の外部キーの関連付け)
①一方向(プライマリ・キー、外部キー)HusbandとWifeテーブル、a、プライマリ・キー関連b、外部キー関連(wifeはparent)、c、プライマリ・キー関連d、外部キー関連(husbandはparent)
1対1の外部キーの関連付け:
annotation:@oneToOne  @JoinColumn(name="wifeId")
                    xml       unique="true"/>
annotation@PrimaryKeyJoinColumn(name="id",referencedColumnName="id")
                    xml: <one-to-one name="stu" constrained="true"/>

 
②双方向(主キー、外部キー)
1対1の外部キーの関連付け:
annotation:husbandクラス:@oneToOne
wifeクラスでは:@OneToOne(mappedBy="wife")が相手を主導しており、一対一の双方向外部キー関連に対してmappedByを書かなければならない
                    xml :
                        one-to-one>
              
                        stuparam>
generator>
1対1の双方向プライマリ・キーの関連付け:
annotation:
@OneToOne
    @PrimaryKeyJoinColumn(name="id",referencedColumnName="id")
 
    @OneToOne(mappedBy="wife")
    @PrimaryKeyJoinColumn(name="id",columnDefinition="id")
a,Husbandのidはwifeのidと相互に関連するb,husbandの外部キーwifeidとwifeのhusbandid
結合プライマリ・キーの関連付け(重要ではありません):
Annotation:
    @OneToOne
    @JoinColumns(
        {
            @JoinColumn(name="wifid",referencedColumnName="id"),
            @JoinColumn(name="wifename",referencedColumnName="name")
        }     
    )
③中間表1枚の中間表を作成する
一対多
①一方向:
annotation:一方に集合(Set)を加え,hibernateはそれを多対多関係処理としてデータベースに関係テーブルを構築した.
    @OneToMany
    @JoinColumn(name="groupid")
    public Set getUsers() {
       return users;
    }
    public void setUsers(Set users) {
       this.users = users;
    } 
Xml:
       
            key>
           
        set>
②双方向(多対一の双方向関連、一対多の双方向関連は同じ)
複数対1:
①ワンウェイ(manytooneのワンウェイ関連):複数の方に外部キーを付ける.1 NF、プライマリキーがある場合、列は分けられない;2 NF連合プライマリキーは部分的に3 NFに依存して伝達依存が存在できない.設計原則:冗長を発生できない.
 
     annotation:@ManyToOne 
     xml:many-to-one>
 
②双方向:(多対一の双方向関連、一対多の双方向関連は同じ)
   Annotation:@ManyToOne 
   xml:
       
 
 
多対多
①一方向
annotation: @ManyToMany
 
xml :
   
       
   
   
       
       
            class="Address"/>
   
 
   
       
   
 
②双方向:
Annotation:
/**
*ManyToManyは複数対複数の関係を示します
*JoinTableは中間テーブルを生成し、nameは中間テーブルの名前を指定し、joinColumns
*このテーブルを参照するプライマリ・キーの中間テーブルのプロパティ名を指定します.inverseJoinColumns
*関連テーブルを参照するプライマリ・キーの中間テーブルのプロパティ名を指定します. 
 *
 */
    @ManyToMany
    @JoinTable(name="t_t",joinColumns={
           @JoinColumn(name="t_id")
    },inverseJoinColumns={@JoinColumn(name="s_id")})
 
    @ManyToMany(mappedBy="students")
Xml:
 
xml version="1.0"?>
DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 

 
   
        
            generator>
         id>
         property>
       
            key>
            
        set>
    class>
hibernate-mapping>
 
xml version="1.0"?>
DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 

 
   
        
            generator>
         id>
         property>
        
           
           
         set>
        
    class>
hibernate-mapping>