`
lihengzkj
  • 浏览: 45043 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JPA初探05---一对多的双向关联

 
阅读更多
关系:
订单 ---> 订单项
一对多的双向关联

JPA规范:一对多的双向关联,多的一方是负责关系维护,负责外键的更新。关系的被维护段是没有权利更新外键的。其实我们仔细理解:本来一对多的关系中多方是记录一方的外键,那么肯定是由多方去更新自己的外键。


【Java类设计,包含数据库设计】
package OneToMany;

import java.util.Date;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
 * 订单类
 * @author 青山
 * @date 2014年10月19日
 * @file name: Order.java
 * 
 *  create table t_order(
		orderid int primary key,
		orderdate date,
		summoney numeric(10,2)
	);
	和订单明细时一对多的双向关联
 */
@Entity
@Table(name="t_order")
public class Order {
	@Id
	@Column(name="orderid")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int orderid;
	
	@Temporal(TemporalType.DATE)
	@Column(name="orderdate")
	private Date date;
	
	//mappedBy相当于在hibernate中配置set的时候的inverse的配置
	@OneToMany(mappedBy="order",fetch=FetchType.LAZY,cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.REMOVE})
	private Set<OrderItem> items;
	
	@Column(name="summoney")
	private double sum;
	
	public int getOrderid() {
		return orderid;
	}
	public void setOrderid(int orderid) {
		this.orderid = orderid;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public Set<OrderItem> getItems() {
		return items;
	}
	public void setItems(Set<OrderItem> items) {
		this.items = items;
	}
	public double getSum() {
		return sum;
	}
	public void setSum(double sum) {
		this.sum = sum;
	}
}

【订单项】
package OneToMany;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

/**
 * 订单明细类
 * @author 青山
 * @date 2014年10月19日
 * @file name: OrderItem.java
 * 
 *  create table t_orderitem(
		itemid int primary key AUTO_INCREMENT,
		productname varchar(45),
		productcount int,
		price numeric(10,2),
		pk_orderid int
	);

 */
@Entity
@Table(name="t_orderitem")
public class OrderItem {
	@Id
	@Column(name="itemid")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int oiid;
	
	@Column(name="productname")
	private String productName;
	
	@Column(name="productcount")
	private int count;
	
	@Column(name="price")
	private float price;
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="pk_orderid")
	private Order order;
	
	
	public int getOiid() {
		return oiid;
	}
	public void setOiid(int oiid) {
		this.oiid = oiid;
	}
	public String getProductName() {
		return productName;
	}
	public void setProductName(String productName) {
		this.productName = productName;
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	public Order getOrder() {
		return order;
	}
	public void setOrder(Order order) {
		this.order = order;
	}
	
	
}
【测试】
package OneToMany;

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

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import util.JPAManagerFactory;

public class TestOneMany {
	public static void main(String[] args) {
		EntityManager manager = JPAManagerFactory.getMFInstance().getManager();
		EntityTransaction et = manager.getTransaction();
		et.begin();
		
//		add(manager);
//		query(manager);
		query2(manager);
		
		et.commit();
		manager.close();
	}
	
	 static void query(EntityManager manager) {
		Order order = manager.find(Order.class, 2);
		System.out.println(order.getDate());
		Set<OrderItem> set = order.getItems();
		System.out.println(set.size());
		for(OrderItem item : set){
			System.out.println(item.getProductName());
		}
	}
	
	 static void query2(EntityManager manager) {
		OrderItem item = manager.find(OrderItem.class, 3);
		System.out.println(item.getProductName());
		Order order = item.getOrder();
		System.out.println(order.getDate()+" "+order.getSum());
		System.out.println(order.getItems().size());
	}

	static void add(EntityManager manager){
		Order order = new Order();
		order.setDate(new Date());
		order.setSum(10);
		
		Set<OrderItem> set = new HashSet<OrderItem>();
		OrderItem item1 = new OrderItem();
		item1.setCount(5);
		item1.setPrice(15.5f);
		item1.setProductName("IPhone4S");
		
		
		OrderItem item2 = new OrderItem();
		item2.setCount(5);
		item2.setPrice(15.5f);
		item2.setProductName("IPhone6");
		
		set.add(item2);
		set.add(item1);
		
		order.setSum(item1.getPrice()*item1.getCount()+item2.getPrice()*item2.getCount());
		
		order.setItems(set);
		
		item1.setOrder(order);
		item2.setOrder(order);
		
		manager.persist(order);
	}
}

 

分享到:
评论

相关推荐

    hibernate-jpa-2.1-api-1.0.2.Final-API文档-中文版.zip

    赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...

    hibernate-jpa-2.1-api-1.0.2.Final-API文档-中英对照版.zip

    赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...

    hibernate-jpa-2.1-api-1.0.0.final-sources.jar

    hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码 hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码

    hibernate-jpa-2.0-api-1.0.1.Final.jar

    hibernate-jpa-2.0-api-1.0.1.Final.jar

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码

    hibernate-jpa-2.1-api-1.0.0.final.jar.zip

    `hibernate-jpa-2.1-api-1.0.0.final.jar`是Hibernate对JPA 2.1规范的实现库,它使得开发者能够使用Hibernate的高效功能同时遵循JPA规范。 **1. Hibernate与JPA的关系** Hibernate最初作为一个独立的ORM框架,后来...

    hibernate-jpa-2.1-api-1.0.0.Final.jar

    hibernate-jpa-2.1-api-1.0.0.Final.jar官方下载,请放心使用

    hibernate-jpa-2.0-api-1.0.0-CR-1.jar

    java.lang.NoClassDefFoundError: javax/persistence/spi/ProviderUtil 或javax/persistence/entitylistener问题

    hibernate-jpa-2.1-api-1.0.2.Final.jar

    java运行依赖jar包

    hibernate-jpa-2.0-api-1.0.1.Final-sources

    总之,深入研究"hibernate-jpa-2.0-api-1.0.1.Final-sources"源码不仅可以增强我们对JPA规范的理解,也能帮助我们在实际开发中更好地利用Hibernate,提高代码质量和项目效率。通过分析源码,我们可以找到优化点,...

    hibernate-jpa-2.1-api-1.0.0.final-sources.jar.zip

    本篇文章将重点围绕“hibernate-jpa-2.1-api-1.0.0.final-sources.jar.zip”这一压缩包,深入解析Hibernate对JPA 2.1 API的实现,以期帮助读者深入理解其内部机制。 JPA(Java Persistence API)是Java平台上的一个...

    hibernate-jpa-2.1-api 1.0.0.Final API

    6. **关系映射**:包括一对一、一对多、多对一和多对多的关系,使用@OneToOne, @OneToMany, @ManyToOne 和 @ManyToMany 注解来定义。 7. **懒加载(Lazy Loading)**:一种优化策略,关联的对象在需要时才从数据库...

    JPA_2_一对多双向关联关系

    **JPA 2 一对多双向关联关系** Java Persistence API(JPA)是Java平台上的一个标准,用于处理对象关系映射(ORM),使得开发者可以使用面向对象的方式操作数据库。在JPA中,一对多关联关系是常见的实体间关系类型...

    JPA学习笔记-EJB-04JPA关联映射总结

    4. `@ManyToMany`:多对多关系,多个实体可以关联多个其他实体,通常需要一个中间表来存储关系。 在实际应用中,JPA的关联映射不仅可以简化对象关系映射的配置,还能提供诸如级联操作(`@CascadeType`)和懒加载(`...

    querydsl-jpa-codegen-3.3.3.zip

    综上所述,"querydsl-jpa-codegen-3.3.3.zip" 为Java开发者带来了高效、类型的JPA查询解决方案,而"JBugmenot.zip"则提供了一种便捷的匿名登录机制。这两个开源项目展示了Java社区的创新精神和对开发效率的追求。...

    JPA中的一对一双向关联

    在Java Persistence API (JPA) 中,一对一双向关联是一种关系映射,它允许两个实体类之间存在一对一的关系,并且每个实体都能引用对方。这种关联是双向的,意味着每个实体都可以通过自己的属性访问到另一个实体。...

    springboot-jpa-activiti-bootstrap-master

    总结来说,"springboot-jpa-activiti-bootstrap-master"项目是一个集成了SpringBoot、JPA和Activiti的实战案例,它涵盖了后端开发的多个重要环节,对于想要提升企业级应用开发能力的开发者来说,这是一个非常有价值...

Global site tag (gtag.js) - Google Analytics