Hibernate学习笔记----双向多对一

来源:互联网 发布:php蜘蛛程序 编辑:程序博客网 时间:2024/06/04 18:53

需求:演示双向多对一

Customer.java

package cn.limbo.hibernate.entity;import java.util.HashSet;import java.util.Set;public class Customer {private Integer customerId;private String customerName;/** * 1.声明集合类型时,需要使用接口类型,因为Hibernate在获取集合类型,返回的是Hibernate *  内置的集合类型,而不是JavaSE标准的集合实现 * 2.需要把集合初始化,否则会出现空指针异常 */private Set<Order> orders = new HashSet<>();public void setOrders(Set<Order> orders) {this.orders = orders;}public Set<Order> getOrders() {return orders;}public Integer getCustomerId() {return customerId;}public void setCustomerId(Integer customerId) {this.customerId = customerId;}public String getCustomerName() {return customerName;}public void setCustomerName(String customerName) {this.customerName = customerName;}}
Order.java

package cn.limbo.hibernate.entity;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;}}
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 2016-7-21 10:48:09 by Hibernate Tools 3.5.0.Final --><hibernate-mapping package="cn.limbo.hibernate.entity">    <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>                <!-- 映射1对多的那个集合属性 -->        <!-- set:映射set类型的属性,table:set中元素对应的记录放在哪一个数据表中,该值需要和多对一的多的那个表的名字一致 -->        <!--         在一的一端的集合集合节点指定inverse=true,来使一的一端放弃维护关联关系        好处是不会多处update语句,这样提升效率         -->        <set name="orders" table="ORDER" inverse="true">            <key>            <!-- 指定多的表的外键列的名字 -->                <column name="CUSTOMER_ID" />            </key>            <!-- 指定映射类型 -->            <one-to-many class="Order" />        </set>    </class></hibernate-mapping>



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 2016-7-21 10:48:09 by Hibernate Tools 3.5.0.Final --><hibernate-mapping package="cn.limbo.hibernate.entity">    <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"></many-to-one>    </class></hibernate-mapping>
test.java

package cn.limbo.hibernate.entity;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.junit.After;import org.junit.Before;import org.junit.Test;public class Junit {private SessionFactory sessionFactory ;private Session session;private Transaction transaction;@Beforepublic void init(){Configuration configuration = new Configuration().configure();ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();sessionFactory = configuration.buildSessionFactory(serviceRegistry);session = sessionFactory.openSession();transaction = session.beginTransaction();}@Afterpublic void destroy(){transaction.commit();session.close();sessionFactory.close();}@Testpublic void testOneToManyGet(){//1.对多的一端的集合使用延迟加载Customer customer = (Customer) session.get(Customer.class, 1);//2.返回的多的一端的集合时,Hibernate内置的集合//该类型具有延迟加载和存放代理对象的功能System.out.println(customer.getOrders().getClass());//3.可能会抛出LazyInitizationException//4.在需要使用集合中的元素的时候进行初始化}@Testpublic void testOneToMany(){Customer customer = new Customer();customer.setCustomerName("Limbo");Order order1 = new Order();order1.setOrderName("AA");Order order2 = new Order();order2.setOrderName("BB");//设定关联关系order1.setCustomer(customer);order2.setCustomer(customer);customer.getOrders().add(order1);customer.getOrders().add(order2);//执行save:现插入Customer,再插入Order,3条INSERT//先插入一的一端,在插入多的一端,只有INSERT语句session.save(customer);session.save(order1);session.save(order2);//先插入Order,再插入Customer,3条INSERT,2条UPDATE//先插入多的一端,在插入一的一端,会多处UPDATE语句//因为在插入多的一端的时候,无法确定1的一端的外键值,所以只能等一的一端插入后,在额外发送UPDATE语句//推荐先插入一的一端,在插入多的一端,提升效率}@Testpublic void testManyToOneGet(){//1.若查询多的一端的一个对象,则在默认情况下,致查询了多的一端的对象,而没有查询关联的一的那一端Order order = (Order) session.get(Order.class, 3);System.out.println(order.getOrderName());//2.在需要使用到关联的对象的时候,才发送相应的SQL语句Customer customer = order.getCustomer();System.out.println(customer);//3.在查询Customer对象时,由多的一端导航到一的一端时,//若此时session已经关闭,可能会发生LazyInitizationException//4.获取Order对象时,默认情况下,其关联的Customer对象是一个代理对象!}@Testpublic void testUpdate(){Order order = (Order) session.get(Order.class, 3);order.getCustomer().setCustomerName("AAAA");}public void testDelete(){//再不设定级联关系的情况下,且一这一端的对象有多的一端的对象在引用,不能直接删除一这一端的对象Customer customer = (Customer) session.get(Customer.class, 1);session.delete(customer);}@Testpublic void testComponent(){Worker worker = new Worker();Pay pay = new Pay();pay.setMonthlyPay(1000);pay.setYearlyPay(80000);pay.setVacationWithPay(5);worker.setWorkerName("AA");worker.setPay(pay);session.save(worker);}}





0 0
原创粉丝点击