• JPA一对多关联


      关于JPA一对多关联这里使用Order与OrderItem来模拟。一个Order可以关联多个OrderItem,而一个OrderItem只能关联一个Order。Order与OrderItem是一对多的关联关系。Order类如下:

     1 package com.yichun.bean;
     2 
     3 import java.util.HashSet;
     4 import java.util.Set;
     5 
     6 import javax.persistence.CascadeType;
     7 import javax.persistence.Column;
     8 import javax.persistence.Entity;
     9 import javax.persistence.Id;
    10 import javax.persistence.OneToMany;
    11 import javax.persistence.Table;
    12 
    13 @Entity
    14 @Table(name = "orders")
    15 public class Order {
    16 
    17     private String orderId;
    18     private Float amoutn = 0f;
    19     private Set<OrderItem> items = new HashSet<OrderItem>();
    20 
    21     @Id
    22     @Column(length = 12, nullable = false)
    23     public String getOrderId() {
    24         return orderId;
    25     }
    26 
    27     public void setOrderId(String orderId) {
    28         this.orderId = orderId;
    29     }
    30 
    31     @Column(nullable = false)
    32     public Float getAmoutn() {
    33         return amoutn;
    34     }
    35 
    36     public void setAmoutn(Float amoutn) {
    37         this.amoutn = amoutn;
    38     }
    39 
    40     // CascadeType.REFRESH,级联刷新。orderItems更改的时候,就重新加载orderItems
    41 
    42     // CascadeType.PERSIST, 级联保存。insert order insert into orderitem 。调用manager.persist(new Order())的时候才会起作用
    43 
    44     // CascadeType.MERGE,级联更新 。order在游离状态的时候被修改了,order中的orderItem也被修改了,update order for (update orderItem)。 调用manager.merge(order) 的时候才会起作用
    45 
    46     // CascadeType.REMOVE级联删除。 删除order的时候,orderItems也会被删除,没有住外键约束的时候。调用manager.remove(order)的时候才会起作用。
    47     
    48     // 针对实体管理器的四种方法
    49     // fetch =FetchType.LAZY默认是延迟加载。××tomany由一方得到多的一方的时候,默认就是延迟加载,××toone的时候,默认就是立即加载
    50     // 出现mappedBy的类就是关系被维护端。关系由对方里面的order属性维护
    51     @OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST,
    52             CascadeType.MERGE, CascadeType.REMOVE }, mappedBy = "order")
    53     public Set<OrderItem> getItems() {
    54         return items;
    55     }
    56 
    57     public void setItems(Set<OrderItem> items) {
    58         this.items = items;
    59     }
    60 
    61     // 建立两者之间的关系
    62     public void addOrderItem(OrderItem orderItem) {
    63         orderItem.setOrder(this);
    64         this.items.add(orderItem);
    65     }
    66 }

    OrderItem类如下:

     1 package com.yichun.bean;
     2 
     3 import javax.persistence.CascadeType;
     4 import javax.persistence.Column;
     5 import javax.persistence.Entity;
     6 import javax.persistence.GeneratedValue;
     7 import javax.persistence.Id;
     8 import javax.persistence.JoinColumn;
     9 import javax.persistence.ManyToOne;
    10 
    11 @Entity
    12 public class OrderItem {
    13     private Integer id;
    14     private String productName;
    15     private Float sellPrice = 0f;
    16     private Order order;
    17 
    18     @Id
    19     @GeneratedValue
    20     public Integer getId() {
    21         return id;
    22     }
    23 
    24     public void setId(Integer id) {
    25         this.id = id;
    26     }
    27 
    28     @Column(length = 40, nullable = false)
    29     public String getProductName() {
    30         return productName;
    31     }
    32 
    33     public void setProductName(String productName) {
    34         this.productName = productName;
    35     }
    36 
    37     @Column(nullable = false)
    38     public Float getSellPrice() {
    39         return sellPrice;
    40     }
    41 
    42     public void setSellPrice(Float sellPrice) {
    43         this.sellPrice = sellPrice;
    44     }
    45 
    46     // optional=true,在数据库中允许为null
    47     @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = true)// 级联更新,级联刷新
    48     @JoinColumn(name = "order_id")
    49     public Order getOrder() {
    50         return order;
    51     }
    52 
    53     public void setOrder(Order order) {
    54         this.order = order;
    55     }
    56 }

    保存数据:

     1     @Test
     2     public void save() {
     3         EntityManagerFactory factory = Persistence
     4                 .createEntityManagerFactory("testjpa");
     5         EntityManager manager = factory.createEntityManager();
     6         manager.getTransaction().begin();
     7 
     8         Order order = new Order();
     9         order.setAmoutn(120f);
    10         order.setOrderId("999");// UUID.randomUUID().toString()
    11 
    12         OrderItem item = new OrderItem();
    13         item.setProductName("足球");
    14         item.setSellPrice(90f);
    15 
    16         OrderItem item2 = new OrderItem();
    17         item2.setProductName("排球");
    18         item2.setSellPrice(30f);
    19 
    20         // 设置两者之间的关联
    21         order.addOrderItem(item);
    22         order.addOrderItem(item2);
    23 
    24         // 保存Order,此时也会保持OrderItem
    25         manager.persist(order);
    26 
    27         manager.getTransaction().commit();
    28         manager.clear();
    29         factory.close();
    30     }
  • 相关阅读:
    java笔记之日期相关操作
    Android笔记之察看网络状况
    Jsp之复选框的使用
    jsp之table美化
    JSP与servlet之间跳转传值
    request的get/setParameter和get/setAttribute()
    Jsp的button按钮
    使用request.getRequestDispatcher请求转发到一个页面中文乱码解决 【转】
    Servle与JSP之间的相互跳转
    java笔记之null与isEmpty()
  • 原文地址:https://www.cnblogs.com/always-online/p/3459949.html
Copyright © 2020-2023  润新知