`

JPA之OneToMany和ManyToOne处理

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

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

首先建立订单实体类
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 = 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);  
        }  
      
    }  


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


下面看看测试类
Java代码  收藏代码

    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