Hibernate关系映射1:单向N-1关联

单向N-1关联


单向N-1关系,比如多个人对应一个地址,只需从人实体端可以找到对应的地址实体,无须关系某个地址的全部住户。

单向 n-1 关联只需从 n 的一端可以访问 1 的一端。

域模型

从 Order 到 Customer 的多对一单向关联需要在Order 类中定义一个 Customer 属性, 而在 Customer 类中无需定义存放 Order 对象的集合属性

图1

关系数据模型

ORDERS 表中的 CUSTOMER_ID 参照 CUSTOMER 表的主键 图2

Demo

Hibernate 使用 元素来映射多对一关联关系 <many-to-one name="customer" class="Customer" column="CUSTOMER_ID" cascade="all" />

  • name: 设定待映射的持久化类的属性的名字
  • column: 设定和持久化类的属性对应的表的外键
  • class:设定待映射的持久化类的属性的类型
  • cascade:意味着系统将先自动级联插入主表记录,也就是说先持久化Customer对象,再持久化Person对象。开发时不建议使用该属性,建议使用手工的方式。

下面是实体对象,分为Customer(顾客)和Order(订单),其中订单和顾客是N-1关系。

public class Customer {
    private Integer customerId;
    private String customerName;
    //省去get和set方法
}
public class Order {
    private Integer orderId;
    private String orderName;
    private Customer customer;
        //省去get和set方法
}
Customer.hbm.xml

<hibernate-mapping>
    <class name="com.lihui.hibernate.single_n_1.Customer" table="CUSTOMERS">
        <id name="customerId" type="java.lang.Integer">
            <column name="CUSTOMER_ID" />
            <generator class="native" />
        </id>
        <property name="customerName" type="java.lang.String">
            <column name="CUSTOMER_NAME" />
        </property>
    </class>
</hibernate-mapping>
<span style="color: rgb(102, 102, 102); font-family: Verdana, 'Lantinghei SC', 'Hiragino Sans GB', 'Microsoft Yahei', Helvetica, arial, 宋体, sans-serif; font-size: 14px; line-height: 26px;"></span>


Order.hbm.xml

<hibernate-mapping package="com.lihui.hibernate.single_n_1">
    <class name="Order"
        table="ORDERS">
        <id name="orderId" type="java.lang.Integer">
            <column name="ORDER_ID" />
            <generator class="native" />
        </id>
        <property name="orderName" type="java.lang.String">
            <column name="ORDER_NAME" />
        </property>
        <many-to-one name="customer" class="Customer" column="CUSTOMER_ID" cascade="all" />
    </class>
</hibernate-mapping>

Junit Test 由于在Order.hbm.xml中配置了 cascade="all" ,所以只需要保存order对象即可,会首先自动保存级联的Customer对象。

@Test
    public void testSave() {
        Customer customer = new Customer();
        customer.setCustomerName("a");

        Order order1 = new Order();
        order1.setOrderName("A");
        order1.setCustomer(customer);
        Order order2 = new Order();
        order2.setOrderName("B");
        order2.setCustomer(customer);

        session.save(order1);
        session.save(order2);
    }

原文转载于 http://wiki.jikexueyuan.com/project/hibernate_articles/N-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值