一、单向多对一的映射关系
二、项目文件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; } @Override public 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; } @Override public 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
三、CRUD的测试<?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>
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; @Before public 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(); } @After public void Destory() { transaction.commit(); session.close(); sessionFactory.close(); } @Test public 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); } @Test public 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); } @Test public void testManyToOneUpdate() { Order order = (Order) session.get(Order.class, 1); order.getCustomer().setCustomerName("wangwu"); //不能调用update } @Test public void testManyToOneDelete() { //不设定级联关系情况下,且1的这一端有N的对象在引用,不能直接删除一的一端的对象 Customer c = (Customer) session.get(Customer.class, 1); session.delete(c); } }