Hibernate HelloWorld-06 单向多对一的映射关系

来源:互联网 发布:淘宝上找不到的衣服 编辑:程序博客网 时间:2024/05/21 17:30

一、单向多对一的映射关系

1、多个订单对应一个customer

2、customer : 1

3、order:多

4、方向:多个order对应一个customer

5、只需要在订单表里面引用客户id即可,而不是在客户订单里面引用oder集合,实际在表中的关系是:order表里面有一个外键,这个外键是customer表的customerid


二、项目文件

1、order.java

package com.weixuan.hibernate;/* * 单项多对一的关系 * 多个订单对应一个客户 * 那么只需要在订单表里面引用客户id即可,而不是在客户订单里面引用oder集合 * 实际在表中的关系是:order表里面有一个外键,这个外键是customer表的customerid */public class Order {private Integer OrderId;private String OrderName;private Customer customer;public Integer getOrderId() {return OrderId;}public void setOrderId(Integer orderId) {OrderId = orderId;}public String getOrderName() {return OrderName;}public void setOrderName(String orderName) {OrderName = orderName;}public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}@Overridepublic String toString() {return "Order [OrderId=" + OrderId + ", OrderName=" + OrderName+ ", customer=" + customer + "]";}}

2、customer.java

package com.weixuan.hibernate;public class Customer {private Integer CustomerID;private String CustomerName;public Integer getCustomerID() {return CustomerID;}public void setCustomerID(Integer customerID) {CustomerID = customerID;}public String getCustomerName() {return CustomerName;}public void setCustomerName(String customerName) {CustomerName = customerName;}@Overridepublic String toString() {return "Customer [CustomerID=" + CustomerID + ", CustomerName="+ CustomerName + "]";}}

3、order.hbm.xml

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2015-6-1 19:18:30 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping package="com.weixuan.hibernate"><class name="com.weixuan.hibernate.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><!-- 手工配置 映射多对一的映射关系 --><!-- 1、name 多的这一端的属性的名称private Customer customer;2、class 一的那一端对用的类名3、column 一那一端在多这一端对应的数据表中的外键的名字 --><many-to-one name="customer" class="Customer" column="CUSTOMER_ID" ></many-to-one><!-- 系统自动生成的配置 --><!-- <many-to-one name="customer" class="Customer" fetch="join"> <column name="CUSTOMER" /> </many-to-one> --></class></hibernate-mapping>

4、customer.hbm.xml

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2015-6-1 19:18:30 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping package="com.weixuan.hibernate">    <class name="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>

5、hibernate.cfg.xml


<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- 数据库方言 --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property><property name="connection.username">root</property><property name="connection.password">root</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="myeclipse.connection.profile">com.mysql.jdbc.Driver</property><!-- 是否在控制台打印sql --><property name="show_sql">true</property><!-- 格式化 --><property name="format_sql">true</property><!-- 指定自动生成数据表的策略 --><property name="hbm2ddl.auto">update</property><mapping resource="com/weixuan/hibernate/Customer.hbm.xml" /><mapping resource="com/weixuan/hibernate/Order.hbm.xml" /></session-factory></hibernate-configuration>

三、CRUD的测试

package com.weixuan.hibernate.test;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.weixuan.hibernate.Customer;import com.weixuan.hibernate.Order;public class TestHibernateNtoOne {private SessionFactory sessionFactory = null;private Session session = null;private Transaction transaction = null;@Beforepublic void init() {Configuration configuation = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuation.getProperties()).buildServiceRegistry();sessionFactory = configuation.buildSessionFactory(serviceRegistry);session = sessionFactory.openSession();transaction = session.beginTransaction();}@Afterpublic void Destory() {transaction.commit();session.close();sessionFactory.close();}@Testpublic void testManyToOneSave() {Customer customer = new Customer();customer.setCustomerName("AAA");Order order1 = new Order();order1.setOrderName("order1");Order order2 = new Order();order2.setOrderName("order2");// 设定关联关系order1.setCustomer(customer);order2.setCustomer(customer);/** * 1、先插入customer,然后是order是三条insert语句 */// 执行save方法// session.save(customer);// session.save(order1);// session.save(order2);Customer customer1 = new Customer();customer1.setCustomerName("BBB");Order order3 = new Order();order3.setOrderName("order3");Order order4 = new Order();order4.setOrderName("order4");order3.setCustomer(customer1);order4.setCustomer(customer1);/** * 2、先插入order,然后是customer,是两条update语句,三条insert语句 */// 执行save方法session.save(order3);session.save(order4);session.save(customer1);}@Testpublic void testManyToOneGet() {Order order = (Order) session.get(Order.class, 1);System.out.println(order);//此时关闭session,会发生懒加载异常//获取order对象时,默认情况下,关联的customer对象是一个代理对象Customer customer = order.getCustomer();System.out.println(customer);}@Testpublic void testManyToOneUpdate() {Order order = (Order) session.get(Order.class, 1);order.getCustomer().setCustomerName("wangwu");//不能调用update}@Testpublic void testManyToOneDelete() {//不设定级联关系情况下,且1的这一端有N的对象在引用,不能直接删除一的一端的对象Customer c = (Customer) session.get(Customer.class, 1);session.delete(c);}}


0 0
原创粉丝点击