jpa一对多映射案例

订单和订单项就是一对多的关系。一个订单有多个订单项,一个订单项属于某个订单。

订单和订单项映射后的表结构如下:

订单表结构

2011030911263689.png

订单项表结构

2011030911270144.png

下面就以订单和订单项为例介绍多对多映射关系的实例开发

persistence.xml配置文件

 

 
  
<? xml version = " 1.0 " ?>
< 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 " >
<!-- 事务类型:本地事务(仅针对一个数据库)和全局事务(针对多个数据库);RESOURCE_LOCAL: 本地事务 -->
< persistence - unit name = " ljq " transaction - type = " RESOURCE_LOCAL " >
< properties >
< property name = " hibernate.dialect " value = " org.hibernate.dialect.MySQL5Dialect " />
< property name = " hibernate.connection.driver_class " value = " org.gjt.mm.mysql.Driver " />
< property name = " hibernate.connection.username " value = " root " />
< property name = " hibernate.connection.password " value = " mysql " />
< property name = " hibernate.connection.url " value = " jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8 " />
< property name = " hibernate.hbm2ddl.auto " value = " update " />
</ properties >
</ persistence - unit >
</ persistence >

Order订单类

 

 
  
package com.ljq.entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
* one端
*
* 碰到many为末端的加载就是延迟加载,若one为末端则为立即加载,除了one-to-one。
*
*
@author jiqinlin
*
*/
@Entity
@Table(name
= " tb_order " )
@SuppressWarnings(
" serial " )
public class Order implements java.io.Serializable {

// String类型不能用uuid,需要人为指定
@Id
@Column(length
= 12 )
private String orderid;
@Column(nullable
= false )
private Float amount = 0f;
// @OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE})
// mappedBy="order": 指明Order类为双向关系维护端,负责外键的更新
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = " order " )
private Set < OrderItem > items = new HashSet < OrderItem > ();

public Order() {
super ();
}

public Float getAmount() {
return amount;
}

public void setAmount(Float amount) {
this .amount = amount;
}

public String getOrderid() {
return orderid;
}

public void setOrderid(String orderid) {
this .orderid = orderid;
}

public Set < OrderItem > getItems() {
return items;
}

public void setItems(Set < OrderItem > items) {
this .items = items;
}


/**
* 添加订单项
*
*
@param student
*/
public void addOrderItem(OrderItem item) {
if ( ! this .items.contains(item)) {
this .items.add(item);
item.setOrder(
this );
}
}

/**
* 删除订单项
*
*
@param student
*/
public void removeOrderItem(OrderItem item) {
if ( this .items.contains(item)) {
item.setOrder(
null );
this .items.remove(item);
}
}

}

OrderItem订单项类

 

 
  
package com.ljq.entity;

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;

/**
* many端
*
* 在one-to-many双向关联中,多的一方为关系维护端,关系维护端负责外键记录的更新
* 关系被维护端是没有权力更新外键记录的
*
*
@author jiqinlin
*
*/

@Entity
@Table(name
= " tb_orderitem " )
@SuppressWarnings(
" serial " )
public class OrderItem implements java.io.Serializable {
@Id
@GeneratedValue
private Integer id;
@Column(length
= 40 , nullable = false )
private String productName;
@Column(nullable
= false )
private Float sellPrice = 0f;
// optional=true:可选,表示此对象可以没有,可以为null;false表示必须存在
@ManyToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE }, optional = true )
@JoinColumn(name
= " order_id " )
private Order order;

public OrderItem() {
super ();
}

public OrderItem(String productName, Float sellPrice) {
super ();
this .productName = productName;
this .sellPrice = sellPrice;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this .id = id;
}

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;
}

public Order getOrder() {
return order;
}

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

}

OrderTest测试类

 

 
  
package com.ljq.test;

import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.UUID;

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

import org.junit.Test;

import com.ljq.entity.Order;
import com.ljq.entity.OrderItem;
import com.sun.org.apache.xpath.internal.operations.Or;

public class OrderTest {

/**
* 添加订单Order时同时添加两个订单项OrderItem,因为订单Order为双向关系维护者,起着主导作用
*/
@Test
public void save() {
EntityManagerFactory factory
= Persistence.createEntityManagerFactory( " ljq " );
EntityManager em
= factory.createEntityManager();
em.getTransaction().begin();

Order order
= new Order();
order.setAmount(34f);
// UUID.randomUUID().toString()
order.setOrderid( " xxxx " );
order.addOrderItem(
new OrderItem( " 足球 " ,20f));
order.addOrderItem(
new OrderItem( " 篮球 " ,25f));
em.persist(order);

em.getTransaction().commit();
em.close();
factory.close();

}

/**
* 删除Order对象时,会自动删除OrderItem对象(即:父对象删除时子对象跟着删除)
*/
@Test
public void detele1(){
EntityManagerFactory factory
= Persistence.createEntityManagerFactory( " ljq " );
EntityManager em
= factory.createEntityManager();
em.getTransaction().begin();

Order order
= em.getReference(Order. class , " xxxx " );
em.remove(order);

em.getTransaction().commit();
em.close();
factory.close();
}

/**
* 删除子对象时,父对象没影响
*/
@Test
public void detele2(){
EntityManagerFactory factory
= Persistence.createEntityManagerFactory( " ljq " );
EntityManager em
= factory.createEntityManager();
em.getTransaction().begin();

OrderItem item
= em.getReference(OrderItem. class , (Serializable) 3 );
em.remove(item);

em.getTransaction().commit();
em.close();
factory.close();

}

// 运行结果为:
// orderid:xxxx, amount:34.0
// productName:足球price:20.0
// productName:篮球price:25.0
// ===============
@Test
public void find1(){
EntityManagerFactory factory
= Persistence.createEntityManagerFactory( " ljq " );
EntityManager em
= factory.createEntityManager();
em.getTransaction().begin();

List
< Order > orders = em.createQuery( " select o from Order o " ).getResultList();
for (Order order:orders){
System.out.println(
" orderid: " + order.getOrderid() + " , " + " amount: " + order.getAmount());
Set
< OrderItem > orderItems = order.getItems();
for (OrderItem item:orderItems){
System.out.println(
" productName: " + item.getProductName() + " price: " + item.getSellPrice());
}
System.out.println(
" =============== " );
}

em.close();
factory.close();
}

// 运行结果为
// productName:足球price:20.0
// orderid:xxxx, amount:34.0
// ============
// productName:篮球price:25.0
// orderid:xxxx, amount:34.0
// ============
@Test
public void find2(){
EntityManagerFactory factory
= Persistence.createEntityManagerFactory( " ljq " );
EntityManager em
= factory.createEntityManager();
em.getTransaction().begin();

List
< OrderItem > items = em.createQuery( " select o from OrderItem o " ).getResultList();
for (OrderItem item:items){
System.out.println(
" productName: " + item.getProductName() + " price: " + item.getSellPrice());
Order order
= item.getOrder();
System.out.println(
" orderid: " + order.getOrderid() + " , " + " amount: " + order.getAmount());
System.out.println(
" ============ " );
}
em.close();
factory.close();
}


/**
* 测试jpa环境是否搭建成功
*
*/
@Test
public void test() {
Persistence.createEntityManagerFactory(
" ljq " );
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值