inverse 常用在 一对多 双向关联关系中。
以一个订单( Order) 和 item 为例
实体类:Order
public class Order {
private int id;
private int userId;
private int status;
private long orderTime;
private String orderDesc;
private double totalPrice;
private String receiveName;
private String fullAddress;
private String postalCode;
private String phone;
private String mobile;
private Set<Item> items=new HashSet<Item>();
实体类 Item
private int id;
private Order order;
private int productId;
private String productName;
private double dangPrice;
private int productNum;
private double amount;
Item.hbl.xml
<hibernate-mapping>
<class name="tarena.entity.Item" table="d_item">
<id name="id" column="id" type="integer">
<generator class="native"></generator>
</id>
<!-- 采用多对一关系加载order属性值 -->
<many-to-one name="order" column="order_id" cascade="save-update"
class="tarena.entity.Order">
</many-to-one>
<!--
<property name="orderId" column="order_id"
type="integer">
</property>
-->
<property name="productId" column="product_id"
type="integer">
</property>
<property name="productName" column="product_name"
type="string">
</property>
<property name="dangPrice" column="dang_price"
type="double">
</property>
<property name="productNum" column="product_num"
type="integer">
</property>
<property name="amount" column="amount"
type="double">
</property>
</class>
</hibernate-mapping>
order.hbl.xml
<hibernate-mapping>
<class name="tarena.entity.Order" table="d_order">
<id name="id" column="id" type="integer">
<generator class="identity"></generator>
</id>
<property name="userId" column="user_id"
type="integer">
</property>
<property name="status" column="status"
type="integer">
</property>
<property name="orderTime" column="order_time"
type="long">
</property>
<property name="orderDesc" column="order_desc"
type="string">
</property>
<property name="totalPrice" column="total_price"
type="double">
</property>
<property name="receiveName" column="receive_name"
type="string">
</property>
<property name="fullAddress" column="full_address"
type="string">
</property>
<property name="postalCode" column="postal_code"
type="string">
</property>
<property name="phone" column="phone"
type="string">
</property>
<property name="mobile" column="mobile"
type="string">
</property>
<!-- 利用一对多关系加载items集合属性 -->
<set name="items" cascade="save-update" inverse="false">
<!-- 指定关联条件,指定外键字段 -->
<key column="order_id"></key>
<one-to-many class="tarena.entity.Item"/>
</set>
</class>
</hibernate-mapping>
test:
public class test {
public static void main(String[] args) {
Session session = HibernateUitl.getSession();
Order o=new Order();
o.setPhone("123");
Item item1=new Item();
Item item2=new Item();
item1.setProductName("123");
item2.setProductName("1233");
o.getItems().add(item1);
o.getItems().add(item2);
item1.setOrder(o);
item2.setOrder(o);
session.save(o);
}
}
当order.hbl.xml 的 inverse = false 的时候,说明了现在现在由 order 控制着这个关系,所以,这个时候,当 order 改变的时候, Items 也会发生改变。
会有两条update 语句执行。修改 item 的 order 属性。
当order.hbl.xml 的 inverse = true 的时候,只会执行 3条插入语句。