`
TechBirds
  • 浏览: 82508 次
文章分类
社区版块
存档分类
最新评论

JPA学习笔记2

阅读更多

1.一对多的映射关系

demo:订单和订单项
规范: 多的一方维护外键的更新(关系维护端),一的一方没有权利更新外键(被维护关系端)

1.Cascade级联操作类型:(使用前提是对应的实体管理方法),当对某实体进行某操作时,会同时对具有映射关系的实体其相应操作
REFRESH:获取最新的数据
PERSIST:保存
MERGE:更新
REMOVEL:删除
2.加载类型为懒惰加载(碰到某人many的加载类型为延迟加载,碰到one便立即加载)

3.被维护端关系实体会出现mappedby(外键字段)

2.demo:订单和订单项

1.实体bean Order和OrderItem

@Entity
@Table(name="orders")
public class Order {
	/**
	 * 订单编号
	 */
	private String orderId;
	/**
	 * 订单总价
	 */
	private Double cost=0d;
	/**
	 * 订单项
	 */
	private Set<OrderItem> items=new HashSet<OrderItem>();
	
	
	
	/**
	 * @return the orderId
	 */
	@Id @Column(length=36)
	public String getOrderId() {
		return orderId;
	}
	/**
	 * @param orderId the orderId to set
	 */
	public void setOrderId(String orderId) {
		this.orderId = orderId;
	}
	/**
	 * @return the cost
	 */
	@Column(nullable=false)
	public Double getCost() {
		return cost;
	}
	/**
	 * @param cost the cost to set
	 */
	public void setCost(Double cost) {
		this.cost = cost;
	}
	/**
	 * @return the items
	 */
	@OneToMany(cascade={CascadeType.REFRESH,CascadeType.PERSIST,CascadeType.REMOVE,CascadeType.MERGE}
	,mappedBy="order")
	public Set<OrderItem> getItems() {
		return items;
	}
	/**
	 * @param items the items to set
	 */
	public void setItems(Set<OrderItem> items) {
		this.items = items;
	}
	
	/**
	 * 增加订单项
	 * @param oi
	 */
	public void addItems(OrderItem oi){
		this.items.add(oi);
		oi.setOrder(this);
	}
}
@Entity
public class OrderItem {
	/**
	 * 订单项编号
	 */
	private Integer itemId;
	/**
	 * 商品名称
	 */
	private String productName;
	/**
	 * 商品价格
	 */
	private Double price=0d;

	/**
	 * 所属订单
	 */
	private Order order;
	
	
	/**
	 * @return the productName
	 */
	@Column(length=40,nullable=false)
	public String getProductName() {
		return productName;
	}
	/**
	 * @param productName the productName to set
	 */
	public void setProductName(String productName) {
		this.productName = productName;
	}
	/**
	 * @return the price
	 */
	@Column(nullable=false)
	public Double getPrice() {
		return price;
	}
	/**
	 * @param price the price to set
	 */
	public void setPrice(Double price) {
		this.price = price;
	}
	/**
	 * @return the itemId
	 */
	@Id @GeneratedValue
	public Integer getItemId() {
		return itemId;
	}
	/**
	 * @param itemId the itemId to set
	 */
	public void setItemId(Integer itemId) {
		this.itemId = itemId;
	}
	/**
	 * @return the order
	 * 只需要级联更新
	 * optional=false,代表必须存在外键字段
	 */
	@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},fetch=FetchType.EAGER,optional=false)
	@JoinColumn(name="orderId")
	public Order getOrder() {
		return order;
	}
	/**
	 * @param order the order to set
	 */
	public void setOrder(Order order) {
		this.order = order;
	}

}
2.单元测试

public class OneToManyTest {
	
	@Test
	public void test(){
		EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJpa");
		factory.close();
	}
	
	@Test
	public void save(){
		EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJpa");
		EntityManager em=factory.createEntityManager();
		em.getTransaction().begin();
		Order order=new Order();
		order.setOrderId(UUID.randomUUID().toString());
		OrderItem item1=new OrderItem();
		item1.setProductName("Mac pro");
		item1.setPrice(9000d);
		OrderItem item2=new OrderItem();
		item2.setProductName("X1");
		item2.setPrice(10000d);
		OrderItem item3=new OrderItem();
		item3.setProductName("air");
		item3.setPrice(7000d);
		order.addItems(item1);
		order.addItems(item2);
		order.addItems(item3);
		order.setCost(26000d);
		em.persist(order);
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
	
	@Test
	public void update(){
		EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJpa");
		EntityManager em=factory.createEntityManager();
		em.getTransaction().begin();
		Order order=em.find(Order.class, "57372f24-ada7-4c66-b410-ad2aa2cca23b");
		Set<OrderItem> sets=order.getItems();
		for (OrderItem orderItem : sets) {
			if(orderItem.getProductName().equals("air")){
				orderItem.setPrice(7888d);
			}
		}
		order.setCost(26888d);
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
	//删除同上操作....
	
	@Test
	public void test1(){
		System.out.println(UUID.randomUUID().toString());
	}
	
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics