Rumah pangkalan data tutorial mysql one-to-one双向关联之加载

one-to-one双向关联之加载

Jun 07, 2016 pm 03:28 PM
kira-kira persatuan memuatkan

关于hibernate的加载方式有两种,一种是get加载,一种是load加载,load属于延迟加载,使用了动态代理。这不是我们所关心的,我们看一看一对一双向关联在加载时有什么特点,想要观察特点,不得不看hibernate为我们生成的sql语句。 husband类与上一篇没有变化

关于hibernate的加载方式有两种,一种是get加载,一种是load加载,load属于延迟加载,使用了动态代理。这不是我们所关心的,我们看一看一对一双向关联在加载时有什么特点,想要观察特点,不得不看hibernate为我们生成的sql语句。

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;
	}
	

}
Salin selepas log masuk

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;
	}
	

}
Salin selepas log masuk

junit测试方法如下:
@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();
	
	}
Salin selepas log masuk

假设我们在数据中存在一个id为2的husband,他与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=?
Salin selepas log masuk

首先加载husband对象时会把相关联的字段全部加载出来。

但是可以看出来加载wife表的时候会执行两次查询,虽然这两次查询的内容是一样的,但是第一次是查询出的是主表的信息,第二次是为了查出从表信息,这是hibernate的默认加载策略,因为t_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;
	}
	
}
Salin selepas log masuk

我们把抓取方式改成懒抓取,加载输出如下所示:

2014-02-04 17:07:38 INFO org.hibernate.tool.hbm2ddl.SchemaUpdate:182 - HHH000228: Running hbm2ddl schema update
2014-02-04 17:07:38 INFO org.hibernate.tool.hbm2ddl.SchemaUpdate:193 - HHH000102: Fetching database metadata
2014-02-04 17:07:38 INFO org.hibernate.tool.hbm2ddl.SchemaUpdate:205 - HHH000396: Updating schema
2014-02-04 17:07:39 INFO org.hibernate.tool.hbm2ddl.TableMetadata:66 - HHH000261: Table found: hibernate.dbo.t_husband
2014-02-04 17:07:39 INFO org.hibernate.tool.hbm2ddl.TableMetadata:67 - HHH000037: Columns: [id, name]
2014-02-04 17:07:39 INFO org.hibernate.tool.hbm2ddl.TableMetadata:69 - HHH000108: Foreign keys: []
2014-02-04 17:07:39 INFO org.hibernate.tool.hbm2ddl.TableMetadata:70 - HHH000126: Indexes: [pk__t_husban__3213e83f0f624af8]
2014-02-04 17:07:40 INFO org.hibernate.tool.hbm2ddl.TableMetadata:66 - HHH000261: Table found: hibernate.dbo.t_wife
2014-02-04 17:07:40 INFO org.hibernate.tool.hbm2ddl.TableMetadata:67 - HHH000037: Columns: [id, husband_id, name]
2014-02-04 17:07:40 INFO org.hibernate.tool.hbm2ddl.TableMetadata:69 - HHH000108: Foreign keys: [fk_fi3kodkmubgryyblf4935y4dk]
2014-02-04 17:07:40 INFO org.hibernate.tool.hbm2ddl.TableMetadata:70 - HHH000126: Indexes: [pk__t_wife__3213e83f1332dbdc]
2014-02-04 17:07:40 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_
from
t_wife wife0_
where
wife0_.id=?

这样wife类只加载自己主表的信息,不考虑从表的信息了( 当然把husband也是如此,可以自己去试试)。

hibernate默认的加载策略为eager加载,也就是急抓取,会把所关联的信息一次性全部得到,而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();

	}
Salin selepas log masuk

输出如下:

2014-02-04 17:10:51 INFO org.hibernate.tool.hbm2ddl.SchemaUpdate:182 - HHH000228: Running hbm2ddl schema update
2014-02-04 17:10:51 INFO org.hibernate.tool.hbm2ddl.SchemaUpdate:193 - HHH000102: Fetching database metadata
2014-02-04 17:10:51 INFO org.hibernate.tool.hbm2ddl.SchemaUpdate:205 - HHH000396: Updating schema
2014-02-04 17:10:51 INFO org.hibernate.tool.hbm2ddl.TableMetadata:66 - HHH000261: Table found: hibernate.dbo.t_husband
2014-02-04 17:10:51 INFO org.hibernate.tool.hbm2ddl.TableMetadata:67 - HHH000037: Columns: [id, name]
2014-02-04 17:10:51 INFO org.hibernate.tool.hbm2ddl.TableMetadata:69 - HHH000108: Foreign keys: []
2014-02-04 17:10:51 INFO org.hibernate.tool.hbm2ddl.TableMetadata:70 - HHH000126: Indexes: [pk__t_husban__3213e83f0f624af8]
2014-02-04 17:10:51 INFO org.hibernate.tool.hbm2ddl.TableMetadata:66 - HHH000261: Table found: hibernate.dbo.t_wife
2014-02-04 17:10:51 INFO org.hibernate.tool.hbm2ddl.TableMetadata:67 - HHH000037: Columns: [id, husband_id, name]
2014-02-04 17:10:51 INFO org.hibernate.tool.hbm2ddl.TableMetadata:69 - HHH000108: Foreign keys: [fk_fi3kodkmubgryyblf4935y4dk]
2014-02-04 17:10:51 INFO org.hibernate.tool.hbm2ddl.TableMetadata:70 - HHH000126: Indexes: [pk__t_wife__3213e83f1332dbdc]
2014-02-04 17:10:51 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_
from
t_wife wife0_
where
wife0_.id=?
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_
from
t_wife wife0_
where
wife0_.husband_id=?
GossipMan

这样才会加载从表的信息,对于一些其他的语句,可能是hibernate自动生成的其他语句,但只要理解其中的思想就可以了,不要在意这些细节。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Ralat memuatkan pemalam dalam Illustrator [Tetap] Ralat memuatkan pemalam dalam Illustrator [Tetap] Feb 19, 2024 pm 12:00 PM

Ralat memuatkan pemalam dalam Illustrator [Tetap]

Sari kata Stremio tidak berfungsi; ralat memuatkan sari kata Sari kata Stremio tidak berfungsi; ralat memuatkan sari kata Feb 24, 2024 am 09:50 AM

Sari kata Stremio tidak berfungsi; ralat memuatkan sari kata

PHP melaksanakan pemuatan skrol tanpa had PHP melaksanakan pemuatan skrol tanpa had Jun 22, 2023 am 08:30 AM

PHP melaksanakan pemuatan skrol tanpa had

Outlook membeku apabila memasukkan hiperpautan Outlook membeku apabila memasukkan hiperpautan Feb 19, 2024 pm 03:00 PM

Outlook membeku apabila memasukkan hiperpautan

Bagaimana untuk menyelesaikan masalah yang css tidak boleh dimuatkan Bagaimana untuk menyelesaikan masalah yang css tidak boleh dimuatkan Oct 20, 2023 am 11:29 AM

Bagaimana untuk menyelesaikan masalah yang css tidak boleh dimuatkan

Apakah yang perlu saya lakukan jika Windows 7 gagal memuatkan pemacu USB? Apakah yang perlu saya lakukan jika Windows 7 gagal memuatkan pemacu USB? Jul 11, 2023 am 08:13 AM

Apakah yang perlu saya lakukan jika Windows 7 gagal memuatkan pemacu USB?

Bagaimana untuk mengaitkan kunci asing MySQL dan kunci utama secara automatik? Bagaimana untuk mengaitkan kunci asing MySQL dan kunci utama secara automatik? Mar 15, 2024 pm 12:54 PM

Bagaimana untuk mengaitkan kunci asing MySQL dan kunci utama secara automatik?

Bagaimana untuk menggunakan JavaScript untuk mencapai kesan tatal tidak terhingga yang dimuatkan secara automatik apabila menatal ke bahagian bawah halaman? Bagaimana untuk menggunakan JavaScript untuk mencapai kesan tatal tidak terhingga yang dimuatkan secara automatik apabila menatal ke bahagian bawah halaman? Oct 27, 2023 pm 06:30 PM

Bagaimana untuk menggunakan JavaScript untuk mencapai kesan tatal tidak terhingga yang dimuatkan secara automatik apabila menatal ke bahagian bawah halaman?

See all articles