比如你去噹噹網上買書籍,噹噹網就給你一個訂單。
通過上面的業務活動描述你可以分析得出:一個訂單可以包含一個或多個訂單項.那麼我們將將訂單和訂單項設計關係爲(1:N)一對多的關係(排除0)。得出關係我們就使用JPA來實現這個關係(關於建立JPA和基本的配置我就不再說了,如果不明白請看JPA入門篇)。
首先建立訂單實體類
- import java.util.HashSet;
- import java.util.Set;
- import javax.persistence.CascadeType;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.Id;
- import javax.persistence.OneToMany;
- import javax.persistence.Table;
- @Entity
- @Table(name="orders")
- public class Order {
- private String orderid;
- private Float amount = 0f;
- private Set<OrderItem> items = new HashSet<OrderItem>();
- @Id
- @Column(length = 12)
- public String getOrderid() {
- return orderid;
- }
- public void setOrderid(String orderid) {
- this.orderid = orderid;
- }
- @Column(nullable = false)
- public Float getAmount() {
- return amount;
- }
- public void setAmount(Float amount) {
- this.amount = amount;
- }
- @OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE },mappedBy ="order") //這裏配置關係,並且確定關係維護端和被維護端。mappBy表示關係被維護端,只有關係端有權去更新外鍵。這裏還有注意OneToMany默認的加載方式是賴加載。當看到設置關係中最後一個單詞是Many,那麼該加載默認爲懶加載
- public Set<OrderItem> getItems() {
- return items;
- }
- public void setItems(Set<OrderItem> items) {
- this.items = items;
- }
- /**
- *該方法用於向order中加order項
- /*
- public void addOrderItem(OrderItem orderItem){
- orderItem.setOrder(this);//用關係維護端來維護關係
- this.items.add(orderItem);
- }
- }
訂單項的實體類
- import javax.persistence.CascadeType;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- import javax.persistence.JoinColumn;
- import javax.persistence.ManyToOne;
- @Entity
- public class OrderItem {
- private Integer id;
- private String productName;
- private Float sellPrice = 0f;
- private Order order;
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- @Column(length = 40, nullable = false)
- public String getProductName() {
- return productName;
- }
- public void setProductName(String productName) {
- this.productName = productName;
- }
- @Column(nullable = false)
- public Float getSellPrice() {
- return sellPrice;
- }
- public void setSellPrice(Float sellPrice) {
- this.sellPrice = sellPrice;
- }
- @ManyToOne(cascade = {CascadeType.MERGE,CascadeType.REFRESH }, optional = true)
- @JoinColumn(name="order_id")//這裏設置JoinColum設置了外鍵的名字,並且orderItem是關係維護端
- public Order getOrder() {
- return order;
- }
- public void setOrder(Order order) {
- this.order = order;
- }
- }
下面看看測試類
- import javax.persistence.EntityManager;
- import javax.persistence.EntityManagerFactory;
- import javax.persistence.Persistence;
- import org.junit.BeforeClass;
- import org.junit.Test;
- import cn.itcast.bean.Order;
- import cn.itcast.bean.OrderItem;
- public class OneToManyTest {
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- }
- @Test public void addOrder(){
- EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin(); // start transaction
- Order order = new Order();
- order.setAmount(34f);
- order.setOrderid("00001");
- //order中包含的OrderItem項OrderItem1,OrderItem2
- OrderItem orderItem1 = new OrderItem();
- orderItem1.setProductName("書");
- orderItem1.setSellPrice(22f);
- order.addOrderItem(orderItem1); //add orderitem in order
- OrderItem orderItem2 = new OrderItem();
- orderItem2.setProductName("籃球");
- orderItem2.setSellPrice(100f);
- order.addOrderItem(orderItem2);
- em.persist(order); //persist order object
- em.getTransaction().commit(); //commit transaction
- em.close();
- factory.close();
- }
- }