`

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

阅读更多

    我们发现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
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics