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

 

posted @ 2017-11-01 10:16  javaobject  阅读(412)  评论(0编辑  收藏  举报