我们发现sql语句的个数是相同的,功能也差不多,但发现上面在两个update语句里面,又把name设置了一下,但底下的sql语句则显示的比较“智能”一些,不知道为什么,恳请高手解释。
[/size]
public class Address {
private long id;
private String name;
private Person person;
//..........
<hibernate-mapping>
<class name="com.learning.model.Address" table="t_address">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<!--这里做多对一映射,Address有一个属性person,t_adddress表中-->
<--有一个属性叫person_id-->
<many-to-one name="person" column="person_id" />
</class>
</hibernate-mapping>
public class Person {
private long id;
private String name;
private Set<Address> addresses;
<hibernate-mapping>
<class name="com.learning.model.Person" table="t_person">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<!-- 这里做一对多映射,addresses是Person的一个属性-->
<set name="addresses" inverse="false">
<!--通过t_address的person_id字段来关联-->
<key column="person_id" />
<!--addresses里面存储的是entity的实体-->
<one-to-many class="com.learning.model.Address"/>
</set>
</class>
</hibernate-mapping>
假设我们person里面many-to-one的inverse属性设置成true,现在我们运行测试代码:
Session session = HibernateUtil.sessionFactory.getCurrentSession();
Address addressOne = new Address();
Address addressTwo = new Address();
addressOne.setName("one");
addressTwo.setName("two");
Person person = new Person();
person.setName("person");
Set<Address> addresses = new HashSet<Address>();
addresses.add(addressOne);
addresses.add(addressTwo);
//person.setAddresses(addresses);
session.beginTransaction();
session.save(addressOne);
session.save(addressTwo);
session.save(person);
session.getTransaction().commit();
产生的SQL:
--------------------------------------------
insert
into
t_address
(name, person_id)
values
(?, ?)
--------------------------------------------
insert
into
t_address
(name, person_id)
values
(?, ?)
--------------------------------------------
insert
into
t_person
(name)
values
(?)
--------------------------------------------
感觉现在hibernate并没有帮我们自动的设置address的外键。
现在我们看到,若果要程序正确,我们则需要手动的设置address的person属性:
加上下面的代码:
addressOne.setPerson(person);
addressTwo.setPerson(person);
产生的SQL:
--------------------------------------------
insert
into
t_address
(name, person_id)
values
(?, ?)
--------------------------------------------
insert
into
t_address
(name, person_id)
values
(?, ?)
--------------------------------------------
insert
into
t_person
(name)
values
(?)
--------------------------------------------
update
t_address
set
name=?,
person_id=?
where
id=?
--------------------------------------------
update
t_address
set
name=?,
person_id=?
where
id=?
--------------------------------------------
假设我们person里面many-to-one的inverse属性设置成false,现在我们运行测试代码:
[size=large]
并注释掉上面的那两行代码:
addressOne.setPerson(person);
addressTwo.setPerson(person);
运行产生的SQL:
[/size]
--------------------------------------------
insert
into
t_address
(name, person_id)
values
(?, ?)
--------------------------------------------
insert
into
t_address
(name, person_id)
values
(?, ?)
--------------------------------------------
insert
into
t_person
(name)
values
(?)
--------------------------------------------
update
t_address
set
person_id=?
where
id=?
--------------------------------------------
update
t_address
set
person_id=?
where
id=?
--------------------------------------------
- 大小: 8.8 KB
- 大小: 175.6 KB
分享到:
相关推荐
Hibernate中cascade与inverse属性详解
hibernate 级联(cascade和inverse)一对多,Jar包,数据库建表语句都好了,只要修改一下,数据库配置文件,就可以使用了,使用junit进行测试。
JavaEE学习笔记之Hibernate表关系之一对多(inverse详解)
hibernate集合映射inverse和cascade详解.txt
Hibernate中Cascade和inverse的区别,讲解的很详细
于Hibernate中 cascade 与 inverse 的理解。 您买的Hibernate书是哪一本呢? 孙卫琴的精通Hibernate,还是 深入浅出Hibernate还是那本。。。 我是两本都买了,总体来说还可以,但是,有的地方讲的比较书面化,比如...
多对多双向关联 <br>注意映射规则: <set name="roles" table="t_user_role"><br> <key column="userid"/><br> <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/> </set><br> table...
彻底明白Hibernate中的Inverse
和其它许多批注一样,在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+...
该资源包括了hibernate开发中的常见关联映射的源代码,其中包括:one2one,one2many,many2many等,还有继承映射,inverse,fetch,cascade关键字的应用等,对初学者来说,是很实用的,难度适中,很好理解
inverse常用于一对多双向关联关系中。
Hibernate中cascade和inverse应用
hibernate中一对一,一对多,多对多关系的配置,延迟加载,cascade,inverse hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式
hibernate inverse和cascade的详细讲解,相当详细全面的对inverse和cascade区别和用法的讲解
hibernate inverse 个人总结
该源程序代码可以帮助初学者迅速建立hibernate的关联映射的概念,且详细的讲解了cascade和inverse的用法,程序代码进行了详尽的描述,通俗易懂,容易上手
12.5 映射多对一多态关联 12.6 小结 12.7 思考题 第13章 Java集合类 13.1 Set(集) 13.1.1 Set的一般用法 13.1.2 HashSet类 13.1.3 TreeSet类 13.1.4 向Set中加入持久化类的对象 13.2 List(列表...
关于cascade和inverse属性[文].pdf