使用JPA的建立一對多關係
阿新 • • 發佈:2019-02-08
1、persistence.xml檔案
</pre><pre name="code" class="html">資料庫使用oracle
<?xml version="1.0" encoding="UTF-8"?> <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"> <persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver" /> <property name="hibernate.connection.username" value=" " /> <property name="hibernate.connection.password" value=" " /> <property name="hibernate.connection.url" value="jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:xxxx" /> <property name="hibernate.max_fetch_depth" value="5" /> <property name="hibernate.jdbc.fetch_size" value="20" /> <property name="hibernate.jdbc.batch_size" value="10" /> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="false" /> </properties> </persistence-unit> </persistence>
2、訂單類
package entity.oneToMany; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity @Table(name="myorders") public class Order { private Integer id; private String orderId; private Float total; private Set<OrderItem> items=new HashSet<OrderItem>(); @Id @GeneratedValue public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getOrderId() { return orderId; } public void setOrderId(String orderId) { this.orderId = orderId; } @Column(nullable=false) public Float getTotal() { return total; } public void setTotal(Float total) { this.total = total; } //關係被維護端 @OneToMany(cascade=CascadeType.ALL,mappedBy="order") public Set<OrderItem> getItems() { return items; } public void setItems(Set<OrderItem> items) { this.items = items; } /*public void add(OrderItem o){ this.items.add(o); }*/ }
3、訂單項
4 測試類裡的測試方式:package entity.oneToMany; 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; @Entity @Table(name="myorderItem") public class OrderItem { private Integer id; private String productName; private Float sellPrice; private Order order; @Id @GeneratedValue public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(nullable=false) 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; } //關係維護端 設定外來鍵 @ManyToOne(cascade={CascadeType.REFRESH,CascadeType.MERGE},optional=false) @JoinColumn(name="order_id") public Order getOrder() { return order; } public void setOrder(Order order) { this.order = order; } }
<span style="white-space:pre"> </span>@Test
public void save(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa");
EntityManager em = factory.createEntityManager();
//System.out.println(em);
EntityTransaction transaction = em.getTransaction();
transaction.begin();
Order order = new Order();
OrderItem orderItem1 = new OrderItem();
orderItem1.setProductName("羽毛球");
orderItem1.setSellPrice(45f);
orderItem1.setOrder(order);
OrderItem orderItem2 = new OrderItem();
orderItem2.setProductName("籃球球");
orderItem2.setSellPrice(95f);
orderItem2.setOrder(order);
Set<OrderItem> items=new HashSet<OrderItem>();
items.add(orderItem2);
items.add(orderItem1);
order.setOrderId("20151201123");
order.setTotal(100f);
order.setItems(items);
em.persist(order);
transaction.commit();
em.close();
factory.close();
//System.out.println(factory);
}
總結:
1、在處理一對多關係時,通常都是"多"的一方作為關係維護端,"一"的一方為關係被維護端;(黎活明老師提的觀點)
2、最重要的註解如何寫呢?
完成以下幾件事即可:
a.關係維護端(即多的一方)在關聯屬性的get方法上加@ManyToOne註解,並設定cascade級聯、optional=false;
如:@ManyToOne(cascade={CascadeType.REFRESH,CascadeType.MERGE},optional=false)
b.關係維護端(即多的一方)在關聯屬性的get方法上加@JoinColumn註解,並設定外來鍵名稱,
如@JoinColumn(name="order_id")
c.關係被維護端(即“一”的一方),在關聯的屬性的get方法上加@OneToMany註解,並設定cascade級聯、mappedBy屬性(多的一方的那個欄位名)
如:@OneToMany(cascade=CascadeType.ALL,mappedBy="order")
3.完了,上面的第二點是處理對映關係中的重要內容。
希望可以幫到你,謝謝!