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=?
分享到:
相关推荐
当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...
7.2.1 元素的inverse属性 7.2.2 级联删除 7.2.3 父子关系 7.3 映射一对多双向自身关联关系 7.4 改进持久化类 7.5 小结 7.6 思考题 第8章 通过Hibernate操纵对象(上) 8.1 Java对象在JVM中的生命...
本章介绍一对多关联关系的映射方法,重点介绍inverse属性和cascade属性的用法。本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-...
本章介绍一对多关联关系的映射方法,重点介绍inverse属性和cascade属性的用法。本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-...
7.2.1 元素的inverse属性 7.2.2 级联删除 7.2.3 父子关系 7.3 映射一对多双向自身关联关系 7.4 改进持久化类 7.5 小结 7.6 思考题 第8章 通过Hibernate操纵对象(上) 8.1 Java对象在JVM中的生命...
7.2.1 元素的inverse属性 7.2.2 级联删除 7.2.3 父子关系 7.3 映射一对多双向自身关联关系 7.4 改进持久化类 7.5 小结 7.6 思考题 第8章 通过Hibernate操纵对象(上) 8.1 Java对象在JVM中的生命...
7.2.1 元素的inverse属性 7.2.2 级联删除 7.2.3 父子关系 7.3 映射一对多双向自身关联关系 7.4 改进持久化类 7.5 小结 7.6 思考题 第8章 通过Hibernate操纵对象(上) 8.1 Java对象在JVM中的生命...
AUTO 生成器,适用与可移值的应用,多个@Id可以共享同一个 identifier生成器,只要把generator属性设成相同的值就可以。通过@SequenceGenerator 和 @TableGenerator 可以配置不同的 identifier 生成器。 table=...
持久化类的对象,在hibernate应用中可以处于三种状态(根据对象和session之间的关系进行划分): 1. 临时态,瞬态:特点: a) 在数据库中没有记录和它对应 b) 和session没有任何关系 c) New 出来的对象,都处于临时...
9、hibernate的inverse属性的作用? 13、在DAO中如何体现DAO设计模式? 14、spring+Hibernate中委托方案怎么配置? 15、spring+Hibernate中委托方案怎么配置? 16. hibernate进行多表查询每个表中各取几个字段,也...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
5.hibernate中用来做持久化操作的 SessionFactory 1.重量级的,创建和销毁需要消耗很大的资源,不建议频繁创建和销毁 2.线程安全的,一个数据库对应一个Sessionfactory(一般一个应用程序对应一个SessionFactory就...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各...
9、hibernate的inverse属性的作用? 134 13、在DAO中如何体现DAO设计模式? 134 14、spring+Hibernate中委托方案怎么配置? 134 15、spring+Hibernate中委托方案怎么配置? 134 16. hibernate进行多表查询每个表中各取几...