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