JPA一对一双向关联实例

3 篇文章 0 订阅

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&amp;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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值