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.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
//一方
@Entity
@Table(name = "orders")
public class Order {
private Float amount;
private Set<OrderItem> items = new HashSet<OrderItem>();
private int orderid;
@Column(nullable = false)
public Float getAmount() {
return amount;
}
// cascade级联
// CascadeType类型
// CascadeType.REFRESH级联刷新
// CascadeType.PERSIST级联保存
// CascadeType.MERGE級聯更新
// CascadeType.REMOVE級聯刪除
// fetch設置是否延遲載入,默认为延迟加载,所以可不加fetch = FetchType.EAGER
// 出現mappedBy就是關係被維護端
// 以Many结尾的默认为延迟加载,以one结尾的默认为立即加载
@OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST,
CascadeType.MERGE, CascadeType.REMOVE }, mappedBy = "order")
public Set<OrderItem> getItems() {
return items;
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int getOrderid() {
return orderid;
}
public void setAmount(Float amount) {
this.amount = amount;
}
public void setItems(Set<OrderItem> items) {
this.items = items;
}
public void setOrderid(int orderid) {
this.orderid = orderid;
}
public void addOrderItem(OrderItem orderItem) {
orderItem.setOrder(this);
items.add(orderItem);
}
}
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
//多方
@Entity
public class OrderItem {
private int id;
private Order order;
private String productName;
private Float productPrice = 0f;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId() {
return id;
}
// optional=true为可选(可以为空,在表中可以为空)反则,optional = false 不可选,在表中不可以为空
@ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = true)
// 关联字段
// orderid外键名称
@JoinColumn(name = "orderid")
public Order getOrder() {
return order;
}
@Column(nullable = false)
public String getProductName() {
return productName;
}
@Column(length = 50, nullable = false)
public Float getProductPrice() {
return productPrice;
}
public void setId(int id) {
this.id = id;
}
public void setOrder(Order order) {
this.order = order;
}
public void setProductName(String productName) {
this.productName = productName;
}
public void setProductPrice(Float productPrice) {
this.productPrice = productPrice;
}
}
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.BeforeClass;
import org.junit.Test;
public class MainTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test
public void getOrderAndOrderItem() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("one2ManyPU");
EntityManager em = factory.createEntityManager();
Order order = em.getReference(Order.class, 2);
System.out.println("数量:" + order.getAmount()+"编号"+order.getOrderid());
Set<OrderItem> orderItems = order.getItems();
for (OrderItem o : orderItems) {
System.out.println(o.getProductName());
}
em.close();
factory.close();
}
@Test
public void save() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("one2ManyPU");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Order order = new Order();
order.setAmount(38f);
OrderItem orderItem = new OrderItem();
orderItem.setProductName("足球2");
orderItem.setProductPrice(98f);
order.addOrderItem(orderItem);
OrderItem orderItem2 = new OrderItem();
orderItem2.setProductName("篮球2");
orderItem2.setProductPrice(78f);
order.addOrderItem(orderItem2);
em.persist(order);
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void update() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("one2ManyPU");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Order order = em.find(Order.class, 1);
order.setAmount(90f);
em.merge(order);
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void delete() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("one2ManyPU");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Order order = em.find(Order.class, 3);
em.remove(order);
em.getTransaction().commit();
em.close();
factory.close();
}
}
<?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="one2ManyPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name = "hibernate.connection.driver_class" value = "com.mysql.jdbc.Driver"/>
<property name = "hibernate.connection.url" value = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8"/>
<property name = "hibernate.connection.username" value = "root"/>
<property name = "hibernate.connection.password" value = "admin"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.max_fetch_depth" value="1" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.jdbc.fetch_size" value="5" />
<property name="hibernate.jdbc.batch_size" value="3" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>