当前位置:首页 > 开发 > 编程语言 > Hibernate > 正文

hibernate一对多映射的inverse属性的智能性困惑

发表于: 2009-03-20   作者:asialee   来源:转载   浏览次数:
摘要:     我们发现sql语句的个数是相同的,功能也差不多,但发现上面在两个update语句里面,又把name设置了一下,但底下的sql语句则显示的比较“智能”一些,不知道为什么,恳请高手解释。 [/size] public class Address { private long id; private String name;

    我们发现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=?
--------------------------------------------


hibernate一对多映射的inverse属性的智能性困惑

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibern
Hibernate 一对多映射 java类 public class Department{ private String departmentId; private Str
//本人使用的数据库是Mysql //在数据库中分别创建两个表:sex表和muser表 数据库中的sex表和muser表
Hibernate一对多、多对一映射 在自然界中事事物物纷纷扰扰,关系错综复杂,迷迷离离,我们不是在逃
在我们以前的数据库设计中,设计表就不是一件轻松的事情。多种事物之间往往都是有这样那样的关系的
在我们以前的数据库设计中,设计表就不是一件轻松的事情。多种事物之间往往都是有这样那样的关系的
一、Hinbernate中持久化类的关联关系 在数据库中,表表之间是通过外键关联的,在程序中是要转化为持
例如:表示主机HOST含有多个磁盘DISK关系: 在PD的OOM中双击一条关系连线,设置Navigate,这样才会
在学习Hibernate的时候,很大一部分任务量是配置实体映射关系,Hibernate的映射关系的关键就是掌握
关联关系映射,是对象映射关系中相对复杂的一种,但也是用处最多的一种,因为数据中的表不可能都是
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号