JPA学习笔记2

来源:互联网 发布:centos入门到精通 编辑:程序博客网 时间:2024/06/01 08:47

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);}}
@Entitypublic 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 @GeneratedValuepublic 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 {@Testpublic void test(){EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJpa");factory.close();}@Testpublic 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();}@Testpublic 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();}//删除同上操作....@Testpublic void test1(){System.out.println(UUID.randomUUID().toString());}}