one-to-one双方向関連のローディング
hibernateのロード方式については、2つのタイプがあります。一つはgetローディング、もう一つはロードロードで、ロードは遅延ローディングに属し、動的エージェントが使用されています。これは私達が関心しているのではなく、一対の双方向の関連がローディング時にどのような特徴があるかを見てみます。特徴を観察したいです。ヒベルナが私達のために生成したsql文を見なければなりません。
husband類と前編は変わりませんでした。
しかし、Wife表を読み込む時には2回の調査が行われることが分かります。今回の調査の内容は同じですが、初めて調べたのはメインテーブルの情報です。2回目はリスト情報を調べるためです。これはhibernateのデフォルトロードポリシーです。t_uのためです。wife表には外部キーがあります。もし読み込む表が表からあれば、彼はデフォルトでロードされます。同時に二つの表に挟む情報です。テーブル情報からロードするかどうかはfetchで設定します。
私達はwife種類のone-to-oneを新たに一つの属性を追加します。
2014-02-04 17:38 INFO org.hiberg.tool.hbm 2 ddl.SchemaUpdate:182-HH 000228:Running hb 2 ddl schema udate 2014-02-04 17:38 INFO org.hiberg.tool.hbm 2 ddl.SchemaUpdate:193-HH 000102:Fetching database metadata 2014-02-04 17:38 INFO org.hiberg.tool.hbm 2 ddl.SchemaUpdate:205-HH 000396:Updang schema 2014-02-04 17:39 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:66-HHH 000261:Table found:hibernate.dbo.t_husband 2014-02-04 17:39 INFO org.hibernane.tool.hb m 2 ddl.Table Metadata:67-HHHH 00037:Columns:[id,name] 2014-02-04 17:39 INFO org.hiberg.tool.hbm 2 ddl.Table Metadata:69-HHH 000108:Foreign keys:[] 2014-02-04 17:07:39 INFO org.hiberg.tool.hbm 2 ddl.Table Metadata:70-HH 000126:Indexes:[pk幅惸0 f 624 af 8] 2014-02-04 17:40 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:66-HHH 000261:Table found:hibernate.dbo.t_wife 2014-02-04 17:40 INFO org.hibernate.tool.hb m 2 ddl.Table Metadata:67-HHH 000037:Columns:[id,hsband,name] 2014-02-04 17:07:40 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:69-HHH 000108:Foreign keys:[fkufi 3 kodkmubgryyyybalf 4935 y 4 dk] 2014-02-04 17:07:40 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:70-HHH 000126:Indexes:[pk幅83f 1332 dbc] 2014-02-04 17:07:40 INFO org.hibernate.tool.hbm 2 ddl.SchmaUpdate:242-HH 000232:Schhema udate complette ハイベルナ: プロジェクト husband 0_.id as id 1_0_0_、 husband 0_.name as name 2_0_0_、 wife 1_.id as id 1_1_1_、 wife 1_.husband.id as husband_3_1_1_、 wife 1_.name as name 2_1_1_ from tう。husband husband 0_ left outer jun tう。wife wife 1_ on husband 0_.id=wife 1_.husband.id where husband 0_.id=?************************ハイベルナ: プロジェクト wife 0_.id as id 1_1_0_、 wife 0_.husband.id as husband_3_1_0_、 wife 0_.name as name 2_1_0_ from tう。wife wife 0_ where wife 0_.id=ですか
このようにwife類は自分のメインテーブルの情報だけをロードして、表からの情報を考慮しなくなりました(もちろんhussbandもそうです。自分で試してみてもいいです)。
hibernateデフォルトのロードポリシーはエイジャーにロードされます。つまり、急いで取りに行きます。関連する情報を一度に全部入手します。lazyは全部あなたが使います。リストからロードします。
テストの内容を変えます。
2014-02-04 17:10 INFO org.hibernate.tool.hbm 2 ddl.SchemaUpdate:182-HH 000228:Running hbm 2 ddl schema udate 2014-02-04 17:10 INFO org.hiberg.tool.hbm 2 ddl.SchmaUpdate:193-HH 000102:Fetching database metadata 2014-02-04 17:10 INFO org.hiberg.tool.hbm 2 ddl.SchemaUpdate:205-HH 000396:Updang schema 2014-02-04 17:10 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:66-HHH 000261:Table found:hibernate.dbo.t_husband 2014-02-04 17:10 INFO org.hibernane.tool.hbm 2 ddl.Table Metadata:67-HHHH 00037:Columns:[id,name] 2014-02-04 17:10 INFO org.hiberg.tool.hbm 2 ddl.Table Metadata:69-HHH 000108:Foreign keys:[] 2014-02-04 17:10 INFO org.hiberg.tool.hbm 2 ddl.Table Metadata:70-HHH 000126:Indexes:[pk幅惸0 f 624 af 8] 2014-02-04 17:10 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:66-HHH 000261:Table found:hibernate.dbo.t_wife 2014-02-04 17:10 INFO org.hibernate.tool.hb m 2 ddl.Table Metadata:67-HHH 000037:Columns:[id,hsband,name] 2014-02-04 17:10 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:69-HHH 000108:Foreign keys:[fkufi 3 kodmubgryyyyybalf 4935 y 4 dk] 2014-02-04 17:10 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:70-HHH 000126:Indexes:[pk幅83f 1332 dbc] 2014-02-04 17:10 INFO org.hibernate.tool.hbm 2 ddl.SchmaUpdate:242-HH 000232:Schhema udate complette ハイベルナ: プロジェクト husband 0_.id as id 1_0_0_、 husband 0_.name as name 2_0_0_、 wife 1_.id as id 1_1_1_、 wife 1_.husband.id as husband_3_1_1_、 wife 1_.name as name 2_1_1_ from tう。husband husband 0_ left outer jun tう。wife wife 1_ on husband 0_.id=wife 1_.husband.id where husband 0_.id=?************************ハイベルナ: プロジェクト wife 0_.id as id 1_1_0_、 wife 0_.husband.id as husband_3_1_0_、 wife 0_.name as name 2_1_0_ from tう。wife wife 0_ where wife 0_.id=ですかハイベルナ: プロジェクト husband 0_.id as id 1_0_0_、 husband 0_.name as name 2_0_0_、 wife 1_.id as id 1_1_1_、 wife 1_.husband.id as husband_3_1_1_、 wife 1_.name as name 2_1_1_ from tう。husband husband 0_ left outer jun tう。wife wife 1_ on husband 0_.id=wife 1_.husband.id where husband 0_.id=ですかハイベルナ: プロジェクト wife 0_.id as id 1_1_0_、 wife 0_.husband.id as husband_3_1_0_、 wife 0_.name as name 2_1_0_ from tう。wife wife 0_ where wife 0_.husband.id=ですかGossipMan
このようにして表の情報をロードします。他のいくつかの語句については、ヒベルナが自動的に生成した他の語句かもしれませんが、その中の思想を理解すればいいです。これらの詳細は気にしないでください。
husband類と前編は変わりませんでした。
/**
*
*/
package com.maybe.test_1;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
/**
* @author MayBe
*
* function:
*/
@Entity
@Table(name="t_husband")
public class Husband {
private Integer id;
private String name;
private Wife wife;
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
@OneToOne(mappedBy="husband")
public Wife getWife() {
return wife;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}
wife類も変わりませんでした。/**
*
*/
package com.maybe.test_1;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
/**
* @author MayBe
*
* function:
*/
@Entity
@Table(name="t_wife")
public class Wife {
private Integer id;
private String name;
private Husband husband;
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
@OneToOne
public Husband getHusband() {
return husband;
}
public void setHusband(Husband husband) {
this.husband = husband;
}
}
junnitテスト方法は以下の通りです。@Test
public void One_to_oneLoadTest1(){
//
Session s = sessionFacotry.getCurrentSession();
s.beginTransaction();
Husband hus = (Husband)s.get(Husband.class, 2);
System.out.println("*****************");
Wife wif = (Wife)s.get(Wife.class, 3);
s.getTransaction().commit();
}
仮に私たちがデータの中にidが2のhussbandが存在すると仮定して、彼はidが2のwifeと関連しています。データベースにはidが3のwifeがあります。彼女はidが3のhusbandと関連しています。このテストを実行して、sql文を出力します。2014-02-04 16:52:20 INFO org.hibernate.tool.hbm2ddl.SchemaUpdate:182 - HHH000228: Running hbm2ddl schema update
2014-02-04 16:52:20 INFO org.hibernate.tool.hbm2ddl.SchemaUpdate:193 - HHH000102: Fetching database metadata
2014-02-04 16:52:20 INFO org.hibernate.tool.hbm2ddl.SchemaUpdate:205 - HHH000396: Updating schema
2014-02-04 16:52:21 INFO org.hibernate.tool.hbm2ddl.TableMetadata:66 - HHH000261: Table found: hibernate.dbo.t_husband
2014-02-04 16:52:21 INFO org.hibernate.tool.hbm2ddl.TableMetadata:67 - HHH000037: Columns: [id, name]
2014-02-04 16:52:21 INFO org.hibernate.tool.hbm2ddl.TableMetadata:69 - HHH000108: Foreign keys: []
2014-02-04 16:52:21 INFO org.hibernate.tool.hbm2ddl.TableMetadata:70 - HHH000126: Indexes: [pk__t_husban__3213e83f0f624af8]
2014-02-04 16:52:21 INFO org.hibernate.tool.hbm2ddl.TableMetadata:66 - HHH000261: Table found: hibernate.dbo.t_wife
2014-02-04 16:52:21 INFO org.hibernate.tool.hbm2ddl.TableMetadata:67 - HHH000037: Columns: [id, husband_id, name]
2014-02-04 16:52:21 INFO org.hibernate.tool.hbm2ddl.TableMetadata:69 - HHH000108: Foreign keys: [fk_fi3kodkmubgryyblf4935y4dk]
2014-02-04 16:52:21 INFO org.hibernate.tool.hbm2ddl.TableMetadata:70 - HHH000126: Indexes: [pk__t_wife__3213e83f1332dbdc]
2014-02-04 16:52:21 INFO org.hibernate.tool.hbm2ddl.SchemaUpdate:242 - HHH000232: Schema update complete
Hibernate:
select
husband0_.id as id1_0_0_,
husband0_.name as name2_0_0_,
wife1_.id as id1_1_1_,
wife1_.husband_id as husband_3_1_1_,
wife1_.name as name2_1_1_
from
t_husband husband0_
left outer join
t_wife wife1_
on husband0_.id=wife1_.husband_id
where
husband0_.id=?
*****************
Hibernate:
select
wife0_.id as id1_1_0_,
wife0_.husband_id as husband_3_1_0_,
wife0_.name as name2_1_0_,
husband1_.id as id1_0_1_,
husband1_.name as name2_0_1_
from
t_wife wife0_
left outer join
t_husband husband1_
on wife0_.husband_id=husband1_.id
where
wife0_.id=?
Hibernate:
select
wife0_.id as id1_1_1_,
wife0_.husband_id as husband_3_1_1_,
wife0_.name as name2_1_1_,
husband1_.id as id1_0_0_,
husband1_.name as name2_0_0_
from
t_wife wife0_
left outer join
t_husband husband1_
on wife0_.husband_id=husband1_.id
where
wife0_.husband_id=?
まずhusbandオブジェクトをロードすると関連するフィールドを全部ロードします。しかし、Wife表を読み込む時には2回の調査が行われることが分かります。今回の調査の内容は同じですが、初めて調べたのはメインテーブルの情報です。2回目はリスト情報を調べるためです。これはhibernateのデフォルトロードポリシーです。t_uのためです。wife表には外部キーがあります。もし読み込む表が表からあれば、彼はデフォルトでロードされます。同時に二つの表に挟む情報です。テーブル情報からロードするかどうかはfetchで設定します。
私達はwife種類のone-to-oneを新たに一つの属性を追加します。
/**
*
*/
package com.maybe.test_1;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
/**
* @author MayBe
*
* function:
*/
@Entity
@Table(name="t_wife")
public class Wife {
private Integer id;
private String name;
private Husband husband;
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
@OneToOne(fetch=FetchType.LAZY)
public Husband getHusband() {
return husband;
}
public void setHusband(Husband husband) {
this.husband = husband;
}
}
私達はキャプチャ方式を怠け者の捕獲に変えて、ロード出力は下記の通りです。2014-02-04 17:38 INFO org.hiberg.tool.hbm 2 ddl.SchemaUpdate:182-HH 000228:Running hb 2 ddl schema udate 2014-02-04 17:38 INFO org.hiberg.tool.hbm 2 ddl.SchemaUpdate:193-HH 000102:Fetching database metadata 2014-02-04 17:38 INFO org.hiberg.tool.hbm 2 ddl.SchemaUpdate:205-HH 000396:Updang schema 2014-02-04 17:39 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:66-HHH 000261:Table found:hibernate.dbo.t_husband 2014-02-04 17:39 INFO org.hibernane.tool.hb m 2 ddl.Table Metadata:67-HHHH 00037:Columns:[id,name] 2014-02-04 17:39 INFO org.hiberg.tool.hbm 2 ddl.Table Metadata:69-HHH 000108:Foreign keys:[] 2014-02-04 17:07:39 INFO org.hiberg.tool.hbm 2 ddl.Table Metadata:70-HH 000126:Indexes:[pk幅惸0 f 624 af 8] 2014-02-04 17:40 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:66-HHH 000261:Table found:hibernate.dbo.t_wife 2014-02-04 17:40 INFO org.hibernate.tool.hb m 2 ddl.Table Metadata:67-HHH 000037:Columns:[id,hsband,name] 2014-02-04 17:07:40 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:69-HHH 000108:Foreign keys:[fkufi 3 kodkmubgryyyybalf 4935 y 4 dk] 2014-02-04 17:07:40 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:70-HHH 000126:Indexes:[pk幅83f 1332 dbc] 2014-02-04 17:07:40 INFO org.hibernate.tool.hbm 2 ddl.SchmaUpdate:242-HH 000232:Schhema udate complette ハイベルナ: プロジェクト husband 0_.id as id 1_0_0_、 husband 0_.name as name 2_0_0_、 wife 1_.id as id 1_1_1_、 wife 1_.husband.id as husband_3_1_1_、 wife 1_.name as name 2_1_1_ from tう。husband husband 0_ left outer jun tう。wife wife 1_ on husband 0_.id=wife 1_.husband.id where husband 0_.id=?************************ハイベルナ: プロジェクト wife 0_.id as id 1_1_0_、 wife 0_.husband.id as husband_3_1_0_、 wife 0_.name as name 2_1_0_ from tう。wife wife 0_ where wife 0_.id=ですか
このようにwife類は自分のメインテーブルの情報だけをロードして、表からの情報を考慮しなくなりました(もちろんhussbandもそうです。自分で試してみてもいいです)。
hibernateデフォルトのロードポリシーはエイジャーにロードされます。つまり、急いで取りに行きます。関連する情報を一度に全部入手します。lazyは全部あなたが使います。リストからロードします。
テストの内容を変えます。
public void One_to_oneLoadTest1() {
//
Session s = sessionFacotry.getCurrentSession();
s.beginTransaction();
Husband hus = (Husband) s.get(Husband.class, 2);
System.out.println("*****************");
Wife wif = (Wife) s.get(Wife.class, 3);
System.out.println(wif.getHusband().getName());
s.getTransaction().commit();
}
出力は以下の通りです2014-02-04 17:10 INFO org.hibernate.tool.hbm 2 ddl.SchemaUpdate:182-HH 000228:Running hbm 2 ddl schema udate 2014-02-04 17:10 INFO org.hiberg.tool.hbm 2 ddl.SchmaUpdate:193-HH 000102:Fetching database metadata 2014-02-04 17:10 INFO org.hiberg.tool.hbm 2 ddl.SchemaUpdate:205-HH 000396:Updang schema 2014-02-04 17:10 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:66-HHH 000261:Table found:hibernate.dbo.t_husband 2014-02-04 17:10 INFO org.hibernane.tool.hbm 2 ddl.Table Metadata:67-HHHH 00037:Columns:[id,name] 2014-02-04 17:10 INFO org.hiberg.tool.hbm 2 ddl.Table Metadata:69-HHH 000108:Foreign keys:[] 2014-02-04 17:10 INFO org.hiberg.tool.hbm 2 ddl.Table Metadata:70-HHH 000126:Indexes:[pk幅惸0 f 624 af 8] 2014-02-04 17:10 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:66-HHH 000261:Table found:hibernate.dbo.t_wife 2014-02-04 17:10 INFO org.hibernate.tool.hb m 2 ddl.Table Metadata:67-HHH 000037:Columns:[id,hsband,name] 2014-02-04 17:10 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:69-HHH 000108:Foreign keys:[fkufi 3 kodmubgryyyyybalf 4935 y 4 dk] 2014-02-04 17:10 INFO org.hibernate.tool.hbm 2 ddl.Table Metadata:70-HHH 000126:Indexes:[pk幅83f 1332 dbc] 2014-02-04 17:10 INFO org.hibernate.tool.hbm 2 ddl.SchmaUpdate:242-HH 000232:Schhema udate complette ハイベルナ: プロジェクト husband 0_.id as id 1_0_0_、 husband 0_.name as name 2_0_0_、 wife 1_.id as id 1_1_1_、 wife 1_.husband.id as husband_3_1_1_、 wife 1_.name as name 2_1_1_ from tう。husband husband 0_ left outer jun tう。wife wife 1_ on husband 0_.id=wife 1_.husband.id where husband 0_.id=?************************ハイベルナ: プロジェクト wife 0_.id as id 1_1_0_、 wife 0_.husband.id as husband_3_1_0_、 wife 0_.name as name 2_1_0_ from tう。wife wife 0_ where wife 0_.id=ですかハイベルナ: プロジェクト husband 0_.id as id 1_0_0_、 husband 0_.name as name 2_0_0_、 wife 1_.id as id 1_1_1_、 wife 1_.husband.id as husband_3_1_1_、 wife 1_.name as name 2_1_1_ from tう。husband husband 0_ left outer jun tう。wife wife 1_ on husband 0_.id=wife 1_.husband.id where husband 0_.id=ですかハイベルナ: プロジェクト wife 0_.id as id 1_1_0_、 wife 0_.husband.id as husband_3_1_0_、 wife 0_.name as name 2_1_0_ from tう。wife wife 0_ where wife 0_.husband.id=ですかGossipMan
このようにして表の情報をロードします。他のいくつかの語句については、ヒベルナが自動的に生成した他の語句かもしれませんが、その中の思想を理解すればいいです。これらの詳細は気にしないでください。