`
wangqisen
  • 浏览: 47094 次
文章分类
社区版块
存档分类
最新评论

Hibernate中inverse属性的应用

 
阅读更多

inverse为true时表示将主控权交给关联类来执行,在为false时表示由自己来行驶主控权。

inverse属性默认为false,也就是说关系的两端都维护关系。

在一对多映射中,inverse属性多设置为true,也就是说,一对多映射的映射关
系最好由多的一方来维护。

如下所示,为建立的Boy与Girl的关系一对多模型,一个Boy对应多个Girl。

Boy.java

package hibernate.persistance;

import java.sql.Date;
import java.util.HashSet;
import java.util.Set;

public class Boy {
	private int id;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	private String name;
	private byte[] photo;
	private Date date;
	private String description;
	private Set<Girl> girls=new HashSet<Girl>();
	
	public Set<Girl> getGirls() {
		return girls;
	}
	public void setGirls(Set<Girl> girls) {
		this.girls = girls;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public byte[] getPhoto() {
		return photo;
	}
	public void setPhoto(byte[] photo) {
		this.photo = photo;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}

}


Boy.hbm.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">
<hibernate-mapping package="hibernate.persistance">
	<class name="Boy" table="boy">
		<id name="id" column="id" type="integer">
			<generator class="native"></generator>
		</id>
		<property name="name" column="name" type="string"></property>
		<property name="photo" column="photo" type="binary"></property>
		<property name="date" type="date">
			<column name="date"></column>
		</property>
		<property name="description" column="description" type="string"></property>
		<set name="girls" lazy="true" cascade="all" inverse="true">
			<key column="bid"></key>
			<one-to-many class="Girl"/>
		</set>
	</class>
</hibernate-mapping>

Girl.java


package hibernate.persistance;

import java.sql.Date;

public class Girl {
	
	private int id;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	private String name;
	private byte[] photo;
	private Date date;
	private String description;
	private Boy boy;
	
	public Boy getBoy() {
		return boy;
	}
	public void setBoy(Boy boy) {
		this.boy = boy;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public byte[] getPhoto() {
		return photo;
	}
	public void setPhoto(byte[] photo) {
		this.photo = photo;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
}

Girl.hbm.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">
<hibernate-mapping package="hibernate.persistance">
	<class name="Girl" table="girl">
		<id name="id" column="id" type="integer">
			<generator class="native"></generator>
		</id>
		<property name="name" column="name" type="string"></property>
		<property name="photo" column="photo" type="binary"></property>
		<property name="date" column="date" type="date"></property>
		<property name="description" column="description" type="string"></property>
		<many-to-one name="boy" column="bid" class="Boy" cascade="all"></many-to-one>
	</class>
</hibernate-mapping>

测试代码:

public static void test1(){
		Session s=sf.openSession();
		Transaction tx=s.beginTransaction();
		//Boy b=new Boy();
		
		Boy boy = new Boy();
		Set girls = new HashSet();
		Girl g[] = new Girl[]{
		                new Girl(),
		                new Girl(),
		                new Girl()
		};
		girls.add(g[0]);
		girls.add(g[1]);
		girls.add(g[2]);
		g[0].setBoy(boy);
		g[1].setBoy(boy);
		g[2].setBoy(boy);
		s.save(g[0]);
		s.save(g[1]);
		s.save(g[2]);
		tx.commit();
		s.close();
	}


Hibernate只执行了插入语句:

Hibernate: insert into boy (name, photo, date, description) values (?, ?, ?, ?)
Hibernate: insert into girl (name, photo, date, description, bid) values (?, ?, ?, ?, ?)
Hibernate: insert into girl (name, photo, date, description, bid) values (?, ?, ?, ?, ?)
Hibernate: insert into girl (name, photo, date, description, bid) values (?, ?, ?, ?, ?)

防止重复sql语句的生成,因此,inverse设为true的用处就体现出来了。

而如果invers=false,则会生成重复sql语句,如下:

public static void test1(){
		Session s=sf.openSession();
		Transaction tx=s.beginTransaction();
		//Boy b=new Boy();
		Boy boy = new Boy();
		Set girls = new HashSet();
		Girl g[] = new Girl[]{
		                new Girl(),
		                new Girl(),
		                new Girl()
		};
		girls.add(g[0]);
		girls.add(g[1]);
		girls.add(g[2]);
		boy.setGirls(girls);
		s.save(boy);
		tx.commit();
		s.close();
	}

Hibernate除了执行插入语句,还执行了update语句

Hibernate: insert into boy (name, photo, date, description) values (?, ?, ?, ?)
Hibernate: insert into girl (name, photo, date, description, bid) values (?, ?, ?, ?, ?)
Hibernate: insert into girl (name, photo, date, description, bid) values (?, ?, ?, ?, ?)
Hibernate: insert into girl (name, photo, date, description, bid) values (?, ?, ?, ?, ?)
Hibernate: update girl set bid=? where id=?
Hibernate: update girl set bid=? where id=?
Hibernate: update girl set bid=? where id=?




分享到:
评论

相关推荐

    hibernate 3中的缓存小结

    当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     7.2.1 元素的inverse属性  7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章介绍一对多关联关系的映射方法,重点介绍inverse属性和cascade属性的用法。本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-...

    精通Hibernate:对象持久化技术第二版part3

    本章介绍一对多关联关系的映射方法,重点介绍inverse属性和cascade属性的用法。本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     7.2.1 元素的inverse属性  7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     7.2.1 元素的inverse属性  7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     7.2.1 元素的inverse属性  7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命...

    Hibernate注释大全收藏

    AUTO 生成器,适用与可移值的应用,多个@Id可以共享同一个 identifier生成器,只要把generator属性设成相同的值就可以。通过@SequenceGenerator 和 @TableGenerator 可以配置不同的 identifier 生成器。 table=...

    hibernate总结

    持久化类的对象,在hibernate应用中可以处于三种状态(根据对象和session之间的关系进行划分): 1. 临时态,瞬态:特点: a) 在数据库中没有记录和它对应 b) 和session没有任何关系 c) New 出来的对象,都处于临时...

    Java面试宝典2010版

    9、hibernate的inverse属性的作用? 13、在DAO中如何体现DAO设计模式? 14、spring+Hibernate中委托方案怎么配置? 15、spring+Hibernate中委托方案怎么配置? 16. hibernate进行多表查询每个表中各取几个字段,也...

    最新Java面试宝典pdf版

    9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...

    jdbc基础和参考

    5.hibernate中用来做持久化操作的 SessionFactory 1.重量级的,创建和销毁需要消耗很大的资源,不建议频繁创建和销毁 2.线程安全的,一个数据库对应一个Sessionfactory(一般一个应用程序对应一个SessionFactory就...

    Java面试笔试资料大全

    9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...

    JAVA面试宝典2010

    9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...

    Java面试宝典-经典

    9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...

    java面试题大全(2012版)

    9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...

    Java面试宝典2012版

    9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各...

    java面试宝典2012

    9、hibernate的inverse属性的作用? 134 13、在DAO中如何体现DAO设计模式? 134 14、spring+Hibernate中委托方案怎么配置? 134 15、spring+Hibernate中委托方案怎么配置? 134 16. hibernate进行多表查询每个表中各取几...

Global site tag (gtag.js) - Google Analytics