`

Hibenrate 中 inverse="true"

阅读更多

 

 

转:http://www.iteye.com/topic/766211

 

public class Customer { 

     private int id; 

     private String name;

     private Set orders = new HashSet();
}
 

 

即Customer类具有一个set集合属性orders,其中Order类定义如下:

public class Order { 
     private int id; 
     private String orderName;
     
}
 

 

数据库中表的结构:
t_customer:  两个字段:  id   name
t_order:          三个字段: id   orderName   customerid

Customer类的映射文件:Customer.hbm.xml

 

<hibernate-mapping>
	<class name="test.Customer" table="t_customer" lazy="false">  
		<id name="id"> 
		   <generator class="native"/>
		</id>  
		<property name="name"/>  
		<set name="orders"  cascade="save-update"  lazy="false">
		   <key column="customerid"/>
		   <one-to-many class="test.Order"/>
		</set>
    </class> 
</hibernate-mapping>

 

 

执行如下代码:

Set orders = new HashSet();  
Order o1 = new Order();
o1.setOrderName("o1"); 
Order o2 = new Order();
o2.setOrderName("o2");	 
orders.add(o1);
orders.add(o2); 
            
Customer c = new Customer();
c.setName("aaa");
c.setOrders(orders);  

session.save(c);

 此时Hibernate发出的sql语句如下:

 

Hibernate: insert into t_customer (name) values (?)
Hibernate: insert into t_order (orderName) values (?)
Hibernate: insert into t_order (orderName) values (?)
Hibernate: update t_order set customerid=? where id=?
Hibernate: update t_order set customerid=? where id=?
 


查看数据库:

t_customer :                   t_order:  

id   |  name                   id   |   orderName   |   customerid
1       aaa                       1           o1              1
                                     2           o2              1



分析:保存Customer对象时,首先发出insert into t_customer (name) values (?)语句将c同步到数据库,由于在<set>映射中设置cascade="save-update",所以会级联保存orders集合中的 Order类型的o1,o2对象。

现在set映射中设置
inverse="true" ,再次执行上述代码,查看sql语句:

 

Hibernate: insert into t_customer (name) values (?)
Hibernate: insert into t_order (orderName) values (?)
Hibernate: insert into t_order (orderName) values (?)

 相比上一次执行,少了两条update语句,查看数据库:

 

 

 
t_customer :                   t_order:  

id   |  name                   id   |   orderName   |   customerid
1       aaa                      1           o1              NULL
                                    2           o2              NULL

 

发现t_order表中customerid的值为NULL,这是由于设置了inverse="true",它意味着
Customer不再作为主控方,而将关联关系的维护工作交给关联对象Orders来完成。在保存Customer 时,Customer不在关心Orders的customerid属性,必须由Order自己去维护,即设置 order.setCustomer(customer);

 

可以修改Order类代码:

public class Order { 
	private int id; 
	private String orderName;  
	private Customer customer;
         
}

 映射文件Order.hbm.xml:

<hibernate-mapping>
	<class name="test.Order" table="t_order">  
		<id name="id"> 
		   <generator class="native"/>
		</id>  
		<property name="orderName"/>   
		<many-to-one name="customer" column="customerid"/> 
    </class> 
</hibernate-mapping>

 此时数据库中表的结构不会变化。

再次执行上述代码,发出如下sql语句:

Hibernate: insert into t_customer (name) values (?)
Hibernate: insert into t_order (orderName, customerid) values (?, ?)
Hibernate: insert into t_order (orderName, customerid) values (?, ?)

 

发现在保存Order对象时为customerid字段赋值,因为Order对象中拥有Customer属性,对应customerid字段,查看数据库表:

t_customer :                    t_order:  

id   |  name                   id   |   orderName   |   customerid
1       aaa                      1           o1              NULL
                                    2           o2              NULL


发现customerid的值仍为NULL,因为在上述代码中并未设置Order对象的Customer属性值,由于设置了 inverse="true",所以Order对象需要维护关联关系,所以必须进行设置,即order.setCustomer(customer);
修改上述测试代码为:

•••
Customer c = new Customer();
			
Set orders = new HashSet(); 
Order o1 = new Order();
o1.setOrderName("o1"); 
o1.setCustomer(c);
Order o2 = new Order();
o2.setOrderName("o2");
o2.setCustomer(c);
orders.add(o1);
orders.add(o2); 
			
c.setName("aaa");
c.setOrders(orders); 
			
session.save(c); 


 
Hibernate: insert into t_customer (name) values (?)
Hibernate: insert into t_order (orderName, customerid) values (?, ?)
Hibernate: insert into t_order (orderName, customerid) values (?, ?)

 

t_customer :                   t_order:  

id   |  name                   id   |   orderName   |   customerid
1       aaa                      1           o1              1
                                    2           o2              1


发现已经设置了customerid的值。

在一对多关联中,在多的一方设置inverse="true",有助于性能的改善。通过上述分析可以发现少了update语句。

 

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Hibenrate之多对多关联

    在Java的持久化框架Hibernate中,多对多关联(Many-to-Many)是一种常见的数据库关系类型,用于表示两个实体之间存在多个对应关系。这种关联在实际应用中非常常见,例如学生与课程之间的关联,用户与角色之间的关联...

    hibernatewuwei

    hibenrate的代码本人的培训的代码,老师讲解的很好。是一个学习hibenrate的好的工具

    Hibernate更新某些字段

    在实际开发中,我们经常需要更新数据库中的某些字段,而不是所有字段。那么,如何使用 Hibernate 实现更新某些字段呢? 首先,我们需要了解 Hibernate 的 update 方法。在 Hibernate 中, update 方法可以更新整个...

    图书馆之春:您可以在其中借书的图书馆Web应用程序。 这是Spring MVC和Hibernate项目

    数据库和配置MySQL 飞路(用于数据迁移) GradleTomcat吉特Google Book API 后端技术JavaSpring MVC,Spring AOP,Spring Security Hibernate ORM,Hibernate Validator,Hibenrate Search(Lucene) 翻新,JSON ...

    hibernate struts2 spring

    在IT行业中,构建企业级应用是一项复杂而重要的任务。Hibernate、Struts2和Spring是Java领域内非常流行的开源框架,它们分别在持久层、表现层和应用层提供了强大的支持。这三个框架的集成使用,可以构建出高效、稳定...

    公交车查询系统,公交车查询系统

    在这个系统中,用户可以通过输入公交线路号或者站点名称,获取到相应的公交信息,以便规划出行路线。 在技术实现上,Java作为后端开发的主要语言,以其强大的类库支持和跨平台特性,为系统的稳定运行提供了保障。...

    hibernate学习资料

    hibernahibernate学习资料te学习资料hibernate学习资料v

Global site tag (gtag.js) - Google Analytics