hibernateオブジェクト関係マッピング(一対一,一対多,多対一,多対多の一方向,双方向マッピング)
7104 ワード
オブジェクト間の関係:
リレーショナル・マッピング間の関係はオブジェクト間の関係のみであり、データベース・テーブルの関係(外部キー関係)を指すわけではありません.ここで解決される問題は、オブジェクト間の関係の一時、データベース・テーブルがどのようにマッピングされ、プログラミング上でどのように扱われるかです.
1対1(プライマリ・キーの関連付け、一方向の外部キーの関連付け)
①一方向(プライマリ・キー、外部キー)HusbandとWifeテーブル、a、プライマリ・キー関連b、外部キー関連(wifeはparent)、c、プライマリ・キー関連d、外部キー関連(husbandはparent)
1対1の外部キーの関連付け:
annotation:@oneToOne @JoinColumn(name="wifeId")
②双方向(主キー、外部キー)
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>
リレーショナル・マッピング間の関係はオブジェクト間の関係のみであり、データベース・テーブルの関係(外部キー関係)を指すわけではありません.ここで解決される問題は、オブジェクト間の関係の一時、データベース・テーブルがどのようにマッピングされ、プログラミング上でどのように扱われるかです.
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 :
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:
set>
②双方向(多対一の双方向関連、一対多の双方向関連は同じ)
複数対1:
①ワンウェイ(manytooneのワンウェイ関連):複数の方に外部キーを付ける.1 NF、プライマリキーがある場合、列は分けられない;2 NF連合プライマリキーは部分的に3 NFに依存して伝達依存が存在できない.設計原則:冗長を発生できない.
annotation:@ManyToOne
xml:
②双方向:(多対一の双方向関連、一対多の双方向関連は同じ)
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">
id>
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">
id>
set>
class>
hibernate-mapping>