hibernate inverse="true"
来源:互联网 发布:股民信息搜索软件 编辑:程序博客网 时间:2024/06/09 15:52
Customer类:
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 namet_order: 三个字段:id orderName customerid
Customer类的映射文件:Customer.hbm.xml (Order类的映射文件忽略)
<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对象(如果没有这个设置,即cascade="save-update"),那么Hibenrate不会自动保存orders集合中的对象,那么在更新时将会抛出如下异常:
Hibernate: insert into t_customer (name) values (?)Hibernate: update t_order set customerid=? where id=?org.hibernate.TransientObjectException: test.Order••••••
抛出这一异常的原因是:<set>映射默认"inverse=fasle"即由Customer对象作为主控方,那么它要负责关联的维护工作,在这里也就是负责更新t_order表中的customerid字段的值,但由于未设置cascade="save-update",所以orders集合中的对象不会在保存customer时自动保存,因此会抛出异常(如果未设置,需要手动保存)。
现在设置cascade="save-update",同时设置inverse="true",即:
•••<set name="orders" cascade="save-update" inverse="true" lazy="false"><key column="customerid"/><one-to-many class="test.Order"/></set> •••
同样执行上述代码,发出如下语句:
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来维护关联关系,那么这个关联关系转换成双向关联。
修改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语句。
1 0
- hibernate inverse="true"
- hibernate inverse 作用 inverse="true" 作用
- Hibernate inverse 作用 inverse="true" 作用
- Hibernate中inverse="true"
- 【Hibernate】详解Hibernate中的inverse=”true”
- 关于Hibernate中inverse=true
- hibernate中inverse=true粗解
- 关于Hibernate中inverse=true
- Hibernate中“inverse=true”的理解
- hibernate中inverse=true粗解
- Hibernate中inverse="true"的理解
- Hibernate中inverse="true"的理解
- hibernate中inverse=true的使用
- Hibernate中inverse="true"的理解
- hibernate,inverse="true"的问题
- Hibernate中inverse="true"的理解
- Hibernate中inverse="true"的理解
- Hibernate中inverse="true"的理解
- 有时候,坚持了你最不想干的事情之后,会得到你最想要的东西
- 兰州治疗性病选择哪家医院好
- 任务和兴趣
- 微软推出My Bulletins定制化安全公告服务
- 【leetcode】Implement strStr
- hibernate inverse="true"
- 【六一特辑】青春期的孩儿们都叛逆?
- 系统JSON解析的三个参数含义
- js javascript:void(0) 真正含义
- 还原快播"地下"利益链
- web项目部署到真正服务器上后就一直找不到文件路径
- 【奇思妙想】月球上也能有WiFi?
- 快速排序
- 编程新手表示很想知道JAVA中Bean是什么?