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

[color=red][size=large]
我们发现sql语句的个数是相同的,功能也差不多,但发现上面在两个update语句里面,又把name设置了一下,但底下的sql语句则显示的比较“智能”一些,不知道为什么,恳请高手解释。
[/size]
[/color]
[/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>

[size=large]假设我们person里面many-to-one的inverse属性设置成true,现在我们运行测试代码:[/size]

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();

[size=large]
产生的SQL:
[/size]

--------------------------------------------
insert
into
t_address
(name, person_id)
values
(?, ?)
--------------------------------------------
insert
into
t_address
(name, person_id)
values
(?, ?)
--------------------------------------------
insert
into
t_person
(name)
values
(?)
--------------------------------------------

[size=large]感觉现在hibernate并没有帮我们自动的设置address的外键。

现在我们看到,若果要程序正确,我们则需要手动的设置address的person属性:
加上下面的代码:[/size]

addressOne.setPerson(person);
addressTwo.setPerson(person);

[size=large]
产生的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
name=?,
person_id=?
where
id=?
--------------------------------------------
update
t_address
set
name=?,
person_id=?
where
id=?
--------------------------------------------

[size=large]假设我们person里面many-to-one的inverse属性设置成false,现在我们运行测试代码:[/size]
[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=?
--------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值