jpa一对多映射案例
生活随笔
收集整理的這篇文章主要介紹了
jpa一对多映射案例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
訂單和訂單項就是一對多的關系。一個訂單有多個訂單項,一個訂單項屬于某個訂單。
訂單和訂單項映射后的表結構如下:
訂單表結構
訂單項表結構
下面就以訂單和訂單項為例介紹多對多映射關系的實例開發
persistence.xml配置文件
?
<?xml version="1.0"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"><!--事務類型:本地事務(僅針對一個數據庫)和全局事務(針對多個數據庫);RESOURCE_LOCAL: 本地事務 --><persistence-unit name="ljq" transaction-type="RESOURCE_LOCAL"><properties><property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/><property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/><property name="hibernate.connection.username" value="root"/><property name="hibernate.connection.password" value="mysql"/><property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"/><property name="hibernate.hbm2ddl.auto" value="update"/></properties></persistence-unit> </persistence>Order訂單類
?
package com.ljq.entity;import java.util.HashSet; import java.util.Set;import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table;/*** one端* * 碰到many為末端的加載就是延遲加載,若one為末端則為立即加載,除了one-to-one。* * @author jiqinlin* */ @Entity @Table(name = "tb_order") @SuppressWarnings("serial") public class Order implements java.io.Serializable {// String類型不能用uuid,需要人為指定 @Id@Column(length = 12)private String orderid;@Column(nullable = false)private Float amount = 0f;// @OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE})// mappedBy="order": 指明Order類為雙向關系維護端,負責外鍵的更新 @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "order")private Set<OrderItem> items = new HashSet<OrderItem>();public Order() {super();}public Float getAmount() {return amount;}public void setAmount(Float amount) {this.amount = amount;}public String getOrderid() {return orderid;}public void setOrderid(String orderid) {this.orderid = orderid;}public Set<OrderItem> getItems() {return items;}public void setItems(Set<OrderItem> items) {this.items = items;} /*** 添加訂單項* * @param student*/public void addOrderItem(OrderItem item) {if (!this.items.contains(item)) {this.items.add(item);item.setOrder(this);}}/*** 刪除訂單項* * @param student*/public void removeOrderItem(OrderItem item) {if (this.items.contains(item)) {item.setOrder(null);this.items.remove(item);}}}OrderItem訂單項類
?
package com.ljq.entity;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; import javax.persistence.Table;/*** many端* * 在one-to-many雙向關聯中,多的一方為關系維護端,關系維護端負責外鍵記錄的更新 * 關系被維護端是沒有權力更新外鍵記錄的* * @author jiqinlin* */@Entity @Table(name = "tb_orderitem") @SuppressWarnings("serial") public class OrderItem implements java.io.Serializable {@Id@GeneratedValueprivate Integer id;@Column(length = 40, nullable = false)private String productName;@Column(nullable = false)private Float sellPrice = 0f;// optional=true:可選,表示此對象可以沒有,可以為null;false表示必須存在 @ManyToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE }, optional = true)@JoinColumn(name = "order_id")private Order order;public OrderItem() {super();}public OrderItem(String productName, Float sellPrice) {super();this.productName = productName;this.sellPrice = sellPrice;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getProductName() {return productName;}public void setProductName(String productName) {this.productName = productName;}public Float getSellPrice() {return sellPrice;}public void setSellPrice(Float sellPrice) {this.sellPrice = sellPrice;}public Order getOrder() {return order;}public void setOrder(Order order) {this.order = order;}}OrderTest測試類
?
package com.ljq.test;import java.io.Serializable; import java.util.List; import java.util.Set; import java.util.UUID;import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence;import org.junit.Test;import com.ljq.entity.Order; import com.ljq.entity.OrderItem; import com.sun.org.apache.xpath.internal.operations.Or;public class OrderTest {/*** 添加訂單Order時同時添加兩個訂單項OrderItem,因為訂單Order為雙向關系維護者,起著主導作用*/@Testpublic void save() {EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");EntityManager em = factory.createEntityManager();em.getTransaction().begin();Order order = new Order();order.setAmount(34f);//UUID.randomUUID().toString() order.setOrderid("xxxx"); order.addOrderItem(new OrderItem("足球",20f));order.addOrderItem(new OrderItem("籃球",25f));em.persist(order);em.getTransaction().commit();em.close();factory.close();}/*** 刪除Order對象時,會自動刪除OrderItem對象(即:父對象刪除時子對象跟著刪除)*/@Testpublic void detele1(){EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");EntityManager em = factory.createEntityManager();em.getTransaction().begin();Order order=em.getReference(Order.class, "xxxx");em.remove(order);em.getTransaction().commit();em.close();factory.close();}/*** 刪除子對象時,父對象沒影響*/@Testpublic void detele2(){EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");EntityManager em = factory.createEntityManager();em.getTransaction().begin();OrderItem item=em.getReference(OrderItem.class, (Serializable)3);em.remove(item);em.getTransaction().commit();em.close();factory.close();}//運行結果為://orderid:xxxx, amount:34.0//productName:足球price:20.0//productName:籃球price:25.0//=============== @Testpublic void find1(){EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");EntityManager em = factory.createEntityManager();em.getTransaction().begin();List<Order> orders=em.createQuery("select o from Order o").getResultList();for(Order order:orders){System.out.println("orderid:"+order.getOrderid()+", "+"amount:"+order.getAmount());Set<OrderItem> orderItems=order.getItems();for(OrderItem item:orderItems){System.out.println("productName:"+item.getProductName()+"price:"+item.getSellPrice());}System.out.println("===============");}em.close();factory.close();}//運行結果為//productName:足球price:20.0//orderid:xxxx, amount:34.0//============//productName:籃球price:25.0//orderid:xxxx, amount:34.0//============ @Testpublic void find2(){EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");EntityManager em = factory.createEntityManager();em.getTransaction().begin();List<OrderItem> items=em.createQuery("select o from OrderItem o").getResultList();for(OrderItem item:items){System.out.println("productName:"+item.getProductName()+"price:"+item.getSellPrice());Order order=item.getOrder();System.out.println("orderid:"+order.getOrderid()+", "+"amount:"+order.getAmount());System.out.println("============");}em.close();factory.close();}/*** 測試jpa環境是否搭建成功* */@Testpublic void test() {Persistence.createEntityManagerFactory("ljq");}}總結
以上是生活随笔為你收集整理的jpa一对多映射案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 綦江到仁怀有大巴车吗 在那里坐 几个小时
- 下一篇: 布加迪加满油会漏油怎么回事?