zoukankan      html  css  js  c++  java
  • JPA 映射单向多对一的关联关系

    1、首先在多的一端加入一的一端的实体类

    //映射单向n-1的关联关

    //使用@ManyToOne 来映射多对一的关系

    //使用@JoinColumn 来映射外键/可以使用@ManyToOne的fetch属性来修改默认的关联属性的加载策略

    package com.guigu.jpa.helloword;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.Table;
    
    /**
     * 单向多对一
     * 一个订单可以有多个用户
     * 一个用户可以有多个订单
     * @author z
     *
     */
    @Table(name="JPA_ORDERS")
    @Entity
    public class Order {
        private Integer id;
        private String orderName;
        
        private Customer customer;
        @GeneratedValue//使用默认的主键生成方式
        @Id
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
        @Column(name="ORDER_NAME")
        public String getOrderName() {
            return orderName;
        }
    
        public void setOrderName(String orderName) {
            this.orderName = orderName;
        }
        //映射单向n-1的关联关系
        //使用@ManyToOne 来映射多对一的关系
        //使用@JoinColumn 来映射外键
        //可以使用@ManyToOne的fetch属性来修改默认的关联属性的加载策略
        @JoinColumn(name="CUSTOMER_ID")//外键列的列名
        @ManyToOne(fetch=FetchType.LAZY)
        public Customer getCustomer() {
            return customer;
        }
    
        public void setCustomer(Customer customer) {
            this.customer = customer;
        }
    
        @Override
        public String toString() {
            return "Order [id=" + id + ", orderName=" + orderName + ", customer=" + customer + "]";
        }
        
    
    }

    2、测试下代码

    public class JPATest {
        private EntityManagerFactory entityManagerFactory;
        private EntityManager entityManager;
        private EntityTransaction transaction;
        @Before
        public void init(){
            entityManagerFactory= Persistence.createEntityManagerFactory("jpa-1");
            entityManager=entityManagerFactory.createEntityManager();
            transaction=entityManager.getTransaction();
            transaction.begin();//开启事务
            
        }
        @After
        public void destroy(){
            transaction.commit();
            entityManager.close();
            entityManagerFactory.close();
        }
        
        /**
         * 更新操作
         */
        @Test
        public void testManyToOneUpdate(){
            Order order=entityManager.find(Order.class, 2);
            order.getCustomer().setLastName("eeaa");
        }
        /**
         * 单向多对一删除
         * 注意不能直接删除一的一端因为有关系约束
         */
        @Test
        public void testManyToOneRemove(){
    //        Order order=entityManager.find(Order.class, 1);
    //        entityManager.remove(order);//删除多的一端正常删除
            Customer customer=entityManager.find(Customer.class, 5); //删除失败
            entityManager.remove(customer);
            
        }
        
        
        
        //默认情况下,使用左外链接的方式获取n的一端的对象和其关联的1的一段的对象
        //可以使用@ManyToOne的fetch属性来修改默认的关联属性的加载策略
        @Test
        public void testManyToOneFind(){
            Order order=entityManager.find(Order.class, 1);
            System.out.println(order.getOrderName());
            
            System.out.println(order.getCustomer().getLastName());
        
        }
        /**
         * 保存多对一,建议先保存1的一段,后保存n的一段,这样不会多出额外的UPDATE语句
         */
        //可以使用@ManyToOne的fetch属性来修改默认的关联属性的加载策略
        @Test
        public void testManyToOnePersist(){
            Customer customer=new Customer();
            customer.setAge(16);
            customer.setBirth(new Date());
            customer.setCreatedTime(new Date());
            customer.setEmail("AA@163.com");
            customer.setLastName("AA");
            
            Order order1=new Order();
            order1.setOrderName("o-AA-1");
            
            Order order2=new Order();
            order2.setOrderName("o-FF-2");
            
            //设置关联关系
            order1.setCustomer(customer);
            order2.setCustomer(customer);
            
            //执行保存操作
            entityManager.persist(customer);
            entityManager.persist(order1);
            entityManager.persist(order2);    
        }
       } 

    源码地址:https://github.com/wuhongpu/JPA.git

  • 相关阅读:
    Scrapy选择器和持久化
    SQLAlchemy
    Python数据库连接池DBUtils
    flask应用上下文和g
    flask请求上下文源码解析
    flask的session源码流程和第三方组件
    430软狗不喂狗后系统起不来的问题
    VS2008 快捷键大全
    未能加载或程序集“XXXX,Version=0.0.0.0,Culter=neutral,PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。
    用vs2008打开vs2005项目
  • 原文地址:https://www.cnblogs.com/a8457013/p/7765164.html
Copyright © 2011-2022 走看看