您的位置:首页 > 其它

JPA 映射单向多对一的关联关系

2017-11-01 10:16 218 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: