`
jiangduxi
  • 浏览: 456622 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JPA之OneToMany和ManyToOne处理

阅读更多
  前面介绍和总结了JPA的入门知识,也就是搭建环境和简单的使用了JPA的一个实例。现在再来总结下一些常见的关系(一对多和多对一的关系)。
  在学习这些的时候,我们不得单单就学习他本身来学习,我们应该联系相关的一些知识来进行学习。比如Hibernate等
-------------------------------
  例如我们用一个例子来开启JPA的一对多和多对一的学习。

  比如你去当当网上买书籍,当当网就给你一个订单。
  通过上面的业务活动描述你可以分析得出:一个订单可以包含一个或多个订单项.那么我们将将订单和订单项设计关系为(1:N)一对多的关系(排除0)。得出关系我们就使用JPA来实现这个关系(关于建立JPA和基本的配置我就不再说了,如果不明白请看JPA入门篇)。

首先建立订单实体类
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 = 0f;
	private Set<OrderItem> items = new HashSet<OrderItem>();

	@Id
	@Column(length = 12)
	public String getOrderid() {
		return orderid;
	}

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

	@Column(nullable = false)
	public Float getAmount() {
		return amount;
	}

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

	@OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE },mappedBy ="order") //这里配置关系,并且确定关系维护端和被维护端。mappBy表示关系被维护端,只有关系端有权去更新外键。这里还有注意OneToMany默认的加载方式是赖加载。当看到设置关系中最后一个单词是Many,那么该加载默认为懒加载
	public Set<OrderItem> getItems() {
		return items;
	}

	public void setItems(Set<OrderItem> items) {
		this.items = items;
	}
	
         /**
           *该方法用于向order中加order项
          /*
	public void addOrderItem(OrderItem orderItem){
		orderItem.setOrder(this);//用关系维护端来维护关系
		this.items.add(orderItem);
	}

}

订单项的实体类
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;
	}

	@ManyToOne(cascade = {CascadeType.MERGE,CascadeType.REFRESH }, optional = true)
	@JoinColumn(name="order_id")//这里设置JoinColum设置了外键的名字,并且orderItem是关系维护端
	public Order getOrder() {
		return order;
	}

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

}

下面看看测试类
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

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

import cn.itcast.bean.Order;
import cn.itcast.bean.OrderItem;

public class OneToManyTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}
	@Test public void addOrder(){
		 EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
		 EntityManager em = factory.createEntityManager();
		 em.getTransaction().begin(); // start transaction
		 
                   Order order = new Order(); 
		 order.setAmount(34f); 
		 order.setOrderid("00001");
                   
                   //order中包含的OrderItem项OrderItem1,OrderItem2
 		 OrderItem orderItem1 = new OrderItem();
		 orderItem1.setProductName("书");
		 orderItem1.setSellPrice(22f);
		 order.addOrderItem(orderItem1); //add orderitem in order
		 
		 OrderItem orderItem2 = new OrderItem();
		 orderItem2.setProductName("篮球");
		 orderItem2.setSellPrice(100f);
		 order.addOrderItem(orderItem2);
		 
		 em.persist(order); //persist order object
		 em.getTransaction().commit(); //commit transaction
		 em.close();
		 factory.close();
	}
}



总结:OneToMany或者其他的关系,在建立联系的时候,要注意理解关系维护端和关系被维护端
 
分享到:
评论

相关推荐

    JPA_OneToMany学习教程

    "JPA_OneToMany"是JPA中的一个关键概念,涉及实体之间的关联关系,特别是在处理一对多关系时。本教程将深入探讨JPA中的OneToMany映射关系,以及如何在实际开发中有效地应用。 1. **OneToMany关系**:在关系数据库中...

    spring jpa操作数据库 级联数据 hibernate

    - "JPA之OneToMany和ManyToOne处理"的MHT文件深入讨论了这两种关联的处理方法。 - "SpringHibernateJPA0300_BoneCP.rar"可能包含了一个使用 BoneCP 作为连接池的Spring JPA与Hibernate项目。 - "School.rar"和...

    JPA课程manyToMany OneToMany 等全部测试

    **JPA(Java ...`@ManyToMany`和`@OneToMany`注解是JPA中处理复杂关系的重要工具,通过测试可以确保这些关系正确地映射和持久化。在实际项目中,理解并熟练运用这些概念对于提升开发效率和代码质量至关重要。

    JPA学习总结(三)--JPAOneToMany双向关联

    在本篇《JPA学习总结(三)--JPAOneToMany双向关联》中,我们将深入探讨Java Persistence API (JPA)中的OneToMany关系映射,这是一种在数据库表之间建立一对多关联的方式。JPA作为ORM(对象关系映射)框架,允许我们...

    jpa-day3-onetomany.zip

    在Spring Data JPA框架中,我们常常需要处理数据库中的复杂关系,其中一对一、一对多和多对多是最常见的实体关联关系。本教程将重点讲解如何在Spring Data JPA中实现一对多关系,以及如何进行多表联查。在这个名为...

    JPA大全之经典全集

    常见的批注有`@Entity`(定义实体类)、`@Table`(指定映射的数据库表)、`@Id`(定义主键)、`@GeneratedValue`(自动生成主键)、`@ManyToOne`、`@OneToMany`、`@OneToOne`和`@ManyToMany`(定义关联关系)等。...

    JPA中文解释,JPA的API

    在JPA中,注解如`@Entity`用于标记实体类,`@Table`指定对应的数据库表,`@Id`定义主键,`@Column`定义字段属性,`@OneToMany`、`@ManyToOne`、`@OneToOne`和`@ManyToMany`处理关联关系等。针对Oracle,可能还会涉及...

    学习hibernate必读,JPA2新特征和JPA2映射的神秘之旅。

    "JavaOne2009-JPA2映射的神秘之旅.pdf" 和 "JavaOne2009-JPA2新特征.pdf" 这两个文档,显然涵盖了JPA2的重要概念和新特性,特别是关于映射和框架的最新发展。以下是这两个主题的主要知识点: 1. **JPA2新特性**: ...

    jpa学习代码和ppt

    4. **关联(Association)**:JPA支持一对一、一对多、多对一和多对多的关系映射,通过`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`注解来实现。 5. **继承(Inheritance)**:JPA提供了单表继承、联合...

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    - `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`:定义实体之间的关联关系。 **JPA核心概念** 1. **实体(Entity)**:代表数据库中的表,由`@Entity`批注的Java类表示。 2. **实体管理器...

    jpa经典文档呀

    8. **关联映射**:JPA支持一对一、一对多、多对一和多对多的关系映射,通过@OneToOne、@OneToMany、@ManyToOne和@ManyToMany注解实现。 9. **懒加载和级联操作**:懒加载可以延迟加载关联的对象,直到真正需要时才...

    jpa之使用hibernate示例代码

    6. **关联映射**:JPA允许定义实体之间的关联,如一对一(@OneToOne),一对多(@OneToMany),多对一(@ManyToOne)和多对多(@ManyToMany)。这些关联可以通过属性或集合进行映射。 7. **懒加载和即时加载**:...

    使用jpa映射关联和继承

    总结,JPA提供了强大的关联和继承映射机制,让开发者能更便捷地处理数据库操作。正确理解和运用这些特性,可以显著提升Java应用程序的数据管理效率和代码质量。在设计实体模型时,应根据业务需求灵活选择合适的映射...

    JPA

    `@OneToMany`和`@ManyToOne`注解分别用于映射这种关系。`mappedBy`属性用于指定反向映射的字段,`fetch`属性则用于指定加载策略,如`EAGER`立即加载或`LAZY`延迟加载。 - **多对多(Many-to-Many)**:这种关系涉及...

    JPA映射关系详解javax JPA JPA映射关系 JPA映射

    JPA 提供了一种对象关系映射 (ORM) 方法来处理数据库,允许开发者以面向对象的方式操作数据库。本文将详细介绍 JPA 中四种常见的映射关系:一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)以及...

    JPA讲解视频

    7. **关系映射(Relationship Mapping)**:JPA支持一对一、一对多、多对一和多对多的关系映射,如`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`。 8. **继承映射(Inheritance Mapping)**:JPA支持单...

    传智播客JPA学习笔记.pdf

    在JPA中,一对多关系通过@OneToMany和@ManyToOne注解定义,级联操作如CascadeType.PERSIST、CascadeType.REMOVE允许在操作父对象时自动处理子对象的状态。 **11. JPA中的一对多延迟加载与关系维护(一对多关系:二...

    JPA详细文档(JPA 批注参考)

    - `@OneToOne`、`@ManyToOne`、`@OneToMany` 和 `@ManyToMany`:定义不同类型的关联关系。 - `@MapKey` 和 `@OrderBy`:在映射关联集合时提供额外的排序和键控制。 6. **组合和继承批注**: - `@Embeddable`:...

    Jpa的创建和增删改查的代码

    3. **实体关系(Entity Relationships)**: JPA支持多种关系映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)关系。 4. **实体监听器(Entity Listeners)**: 可以...

    jpa框架资源基于hibernate

    3. **实体关系(Entity Relationships)**: 如一对一、一对多、多对一和多对多,使用`@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`注解表示。 4. **查询(Querying)**: 使用JPQL(Java Persistence ...

Global site tag (gtag.js) - Google Analytics