JPA 一对多双向关联

persistence.xml 里面加句  可以自动生成表

 

<property name="hibernate.hbm2ddl.auto" value="update" />

Orders .java

 

package com.launch.jpa;


import java.io.Serializable;
import java.util.HashSet;
import java.util.Date;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "Orders")
public class Orders implements Serializable {

 private static final long serialVersionUID = 4970325922198249712L;
 private Integer orderid;
    private Float amount;
    private Set<OrderItems> orderItems = new HashSet<OrderItems>();
    private Date createdate;

    @Id
    @GeneratedValue 
    public Integer getOrderid() {
        return orderid;
    }
    public void setOrderid(Integer orderid) {
        this.orderid = orderid;
    }
   
    public Float getAmount() {
        return amount;
    }   
    public void setAmount(Float amount) {
        this.amount = amount;
    }
    //对应orderitems getOrder   而不是 orders
    @OneToMany(mappedBy="order",cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @OrderBy(value = "id ASC")
    public Set<OrderItems> getOrderItems() {
        return orderItems;
    }
    public void setOrderItems(Set<OrderItems> orderItems) {
        this.orderItems = orderItems;
    }
   
    @Temporal(value=TemporalType.TIMESTAMP)
    public Date getCreatedate() {
        return createdate;
    }
    public void setCreatedate(Date createdate) {
        this.createdate = createdate;
    }
   
    public void addOrderItem(OrderItems orderitem) {
       if (!this.orderItems.contains(orderitem)) {
            this.orderItems.add(orderitem);
            orderitem.setOrder(this);
       }
    }

    public void removeOrderItem(OrderItems orderitem) {
        if (this.orderItems.contains(orderitem)) {
            orderitem.setOrder(null);
            this.orderItems.remove(orderitem);
        }
    }
   
    /**
     * 返回对象的散列代码值。该实现根据此对象
     * 中 orderid 字段计算散列代码值。
     * @return 此对象的散列代码值。
     */
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (this.orderid != null ? this.orderid.hashCode() : 0);
        return hash;
    }

    /**
     * 确定其他对象是否等于此 Order。当且仅当
     * 参数不为 null 且该参数是具有与此对象相同 orderid 字段值的 Order 对象时,
     * 结果才为 <code>true</code>。
     * @param 对象,要比较的引用对象
     * 如果此对象与参数相同,则 @return <code>true</code>;
     * 否则为 <code>false</code>。
     */
    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Orders)) {
            return false;
        }
        Orders other = (Orders)object;
        if (this.orderid != other.orderid && (this.orderid == null || !this.orderid.equals(other.orderid))) return false;
        return true;
    }

    /**
     * 返回对象的字符串表示法。该实现根据 orderid 字段
     * 构造此表示法。
     * @return 对象的字符串表示法。
     */
    @Override
    public String toString() {
        return this.getClass().getName()+ "[orderid=" + orderid + "]";
    }
}

 

 

OrderItems .java

 

package com.launch.jpa;

import java.io.Serializable;

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 OrderItems implements Serializable {

 private static final long serialVersionUID = -1166337687856636179L;
 private Integer id;
    private String productname;
    private Float price;
    private Orders orders;
   
    public OrderItems() {}
 
    public OrderItems(String productname, Float price) {
        this.productname = productname;
        this.price = price;
    }

    @Id
    @GeneratedValue
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
   
    @Column(length=100, nullable=false)
    public String getProductname() {
        return productname;
    }
    public void setProductname(String productname) {
        this.productname = productname;
    }
   
    public Float getPrice() {
        return price;
    }
    public void setPrice(Float price) {
        this.price = price;
    }
    //optional=true 允许为null
    @ManyToOne(cascade=CascadeType.REFRESH, optional=false)
    @JoinColumn(name = "order_id") 
    public Orders getOrder() {
        return orders;
    }
    public void setOrder(Orders order) {
        this.orders = order;
    }
   
    /**
     * 返回对象的散列代码值。该实现根据此对象
     * 中 id 字段计算散列代码值。
     * @return 此对象的散列代码值。
     */
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (this.id != null ? this.id.hashCode() : super.hashCode());
        return hash;
    }

    /**
     * 确定其他对象是否等于此 OrderItem。当且仅当
     * 参数不为 null 且该参数是具有与此对象相同 id 字段值的 OrderItem 对象时,
     * 结果才为 <code>true</code>。
     * @param 对象,要比较的引用对象
     * 如果此对象与参数相同,则 @return <code>true</code>;
     * 否则为 <code>false</code>。
     */
    @Override
    public boolean equals(Object object) {
        if (!(object instanceof OrderItems)) {
            return false;
        }
        OrderItems other = (OrderItems)object;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) return false;
        return true;
    }

    /**
     * 返回对象的字符串表示法。该实现根据 id 字段
     * 构造此表示法。
     * @return 对象的字符串表示法。
     */
    @Override
    public String toString() {
        return this.getClass().getName()+ "[id=" + id + "]";
    }
}

 


1-m 多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端是没有权利更新外键记录


onetomany or manytomany 后面的many 默认都是延迟加载
manytoone or onetoone  立即加载
JPA,在@OneToMany里加入mappedBy属性避免生成中间表
使用JPA的时候,如果A B两个实体间是一对多,多对一的关系,如果不在@OneToMany里加入mappedBy属性(相当于inverse=”true”)会导致自动生成一个多余的中间表。


TestOrder .java  测试类

 

package com.launch.jpa;

import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.junit.BeforeClass;
import org.junit.Test;

public class TestOrder {

 static EntityManagerFactory factory;

 @BeforeClass
 public static void setUpBeforeClass() throws Exception {
  factory = Persistence.createEntityManagerFactory("jpa");
 }

 @Test
 public void testInsertOrder() {

  try {

   EntityManager eManager = factory.createEntityManager();
   eManager.getTransaction().begin();
   Orders order = new Orders();
   order.setCreatedate(new Date());
   order.addOrderItem(new OrderItems("笔记本电脑", new Float(13200.5)));
   order.addOrderItem(new OrderItems("U盘", new Float(620)));
   order.setAmount(new Float(13200.5 + 620));

   eManager.persist(order);

   eManager.getTransaction().commit();
   eManager.close();
   factory.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 @Test
 public void testGetOrderByID() {
  EntityManager eManager = factory.createEntityManager();
  Orders o = eManager.find(Orders.class, 1);
  System.out.println(o.getAmount());
  for (OrderItems item : o.getOrderItems()) {
   System.out.println(item.getProductname());
  }
 }

 @Test
 public void testGetAllOrder() {
  EntityManager eManager = factory.createEntityManager();
  List<Orders> list = eManager.createQuery("select o from Orders o").getResultList();
  for (Orders order : list) {
   System.out.println(order.getAmount());
  }
 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值