JPA:一对多、多对一关系

10 篇文章 1 订阅

类似于hibernate的一对多和多对一关系,JPA也支持这种关系。多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端是没有权利更新外键记录。

例如订单和订单项之间的关系

Order.java

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;
    private Set<OrderItem> items=new HashSet<OrderItem>();
    
    @Id @Column(length=12)
    public String getOrderid() {
        return Orderid;
    }
    public void setOrderid(String orderid) {
        Orderid = orderid;
    }
    @Column(nullable=false)
    public Float getAmount() {
        return amount;
    }
    public void setAmount(Float amount) {
        this.amount = amount;
    }
  

/**

               JPA中的mappedBy类似于hibernate中的

              <set name="items" inverse=true>
              </set>
              代表对方为关系维护端,本类为关系被维护端

*/

    @OneToMany(cascade={CascadeType.REFRESH,CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE}    //cascade级联
            ,mappedBy="order"    //出现mappedBy的类是关系被维护端,维护关系的order属性

            ,fetch=FetchType.LAZY)//懒加载
    public Set<OrderItem> getItems() {
        return items;
    }
    public void setItems(Set<OrderItem> items) {
        this.items = items;
    }
    public void addOrderItem(OrderItem orderItem){
        orderItem.setOrder(this);
        this.items.add(orderItem);
    }
    
}
OrderItem.java
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;
    }

 

/**
 JPA中的Joincolumn类似于hibernate中的
<ManytoOne column="">

*/  

@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH}

                                ,optional=false)//是否可选,也即数据库中是否可以使null
    @JoinColumn(name="order_id")
    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }
    
    
}   

操作

@Test
    public void save(){
        EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName");
        EntityManager em=factory.createEntityManager();
        em.getTransaction().begin();
        
        Order order=new Order();
        order.setAmount(34f);
        order.setOrderid("999");
        OrderItem orderItem1=new OrderItem();
        orderItem1.setProductName("足球");
        orderItem1.setSellPrice(90f);
        OrderItem orderItem2=new OrderItem();
        orderItem2.setProductName("瑜伽球");
        orderItem2.setSellPrice(30f);
        order.addOrderItem(orderItem1);
        order.addOrderItem(orderItem2);
        
        em.persist(order);//级联之后保存这个的时候这个就一起保存了
        em.getTransaction().commit();
        em.close();
        factory.close();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值