`

一对多双向关系理解

阅读更多

双向一对多关系,一是关系维护端(owner side),多是关系被维护端(inverse side)。

在关系被维护端需要通过@JoinColumn建立外键列指向关系维护端的主键列。

其中默认inverse=false,而mapedBy="xxxx"相当于inverse=true
( 在一对多中,如果要一方维护关系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。
而如果让" 多"方面维护关系时就不会有update操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。
当然这时也要遍历"多"方的每一个对象显 示的操作修关系的变化体现到DB中。不管怎样说,还是让"多"方维护关系更直观一些。)

publicclass Order implements Serializable {

    ...其它省略
    privateSet<OrderItem> orderItems = new HashSet<OrderItem>();
    @OneToMany(mappedBy="order"(有了mappedby不能也不该在此再定义@joincolumn),cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @OrderBy(value= "id ASC")
    public Set<OrderItem> getOrderItems() {
        returnorderItems;
    }
}

 

publicclass OrderItemimplements Serializable {
private Orderorder;
。。。。
    @ManyToOne(cascade=CascadeType.REFRESH,optional=false)
    @JoinColumn(name = "order_id")
    public Order getOrder() {
        returnorder;
    }
}

 
@OrderBy(value = "id ASC") 指明加载OrderItem 时按id的升序排序

@OneToMany的属性:
1、targetEntity
定义关系类的类型,默认是该成员属性对应的类类型,所以通常不需要提供定义。

2、mappedBy
定义类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义,否则可能引起数据一致性的问题。该属性的值是“多”方class里的“一”方的变量名

3、cascade
该属性定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,而且这种关系是递归调用的。

举个例子:Order 和OrderItem有级联关系,那么删除Order时将同时删除它所对应的OrderItem对象。而如果OrderItem还和其他的对象之间有级联关系,那么这样的操作会一直递归执行下去。

cascade的值只能从CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。还有一个选择是使用CascadeType.ALL,表示选择全部四项。

4、fatch
可选择项包括:FetchType.EAGER和FetchType.LAZY。前者表示关系类(本例是OrderItem 类)在主类(本例是Order类)加载的时候同时加载,后者表示关系类在被访问时才加载。默认值是FetchType.LAZY。

@JoinColumn(name = "order_id")注释指定OrderItem映射表的order_id列作为外键与Order 映射表的主键列关联。

@ManyToOne:指明OrderItem和Order之间为多对一关系。

@ManyToOne注释有四个属性:targetEntity、cascade、fetch 和optional,前三个属性的具体含义和@OneToMany的同名属性相同,但@ManyToOne的fetch 属性默认值是FetchType.EAGER。

optional属性是定义该关联类是否必须存在,值为false 时,关联类双方都必须存在,如果关系被维护端不存在,查询的结果为null。值为true 时, 关系被维护端可以不存在,查询的结果仍然会返回关系维护端,在关系维护端中指向关系被维护端的属性为null。optional属性的默认值是true。optional 属性实际上指定关联类与被关联类的join 查询关系,如optional=false 时join 查询关系为inner join,optional=true 时join 查询关系为leftjoin。下面代码片断解释如下:

有一点需要强调:当业务方法需要把一个实体Bean作为参数返回给客户端时,除了实体Bean本身需要实现Serializable 接口之外,如果关联类(OrderItem)是延迟加载,还需在返回实体Bean之前通过访问关联类的方式加载关联类(见下例)。否则在客户端访问关联类时将会抛出加载例外。
   

public OrdergetOrderByID(Integer orderid) {
       Orderorder = em.find(Order.class, orderid);      
       //因为是延迟加载,通过执行size()这种方式获取订单下的所有订单项
      order.getOrderItems().size();
       return order;
    }

 

另外不管是否延迟加载,通过join fetch 关联语句都可显式加载关联类,如下例:

   

public ListgetAllOrder() {
        Queryquery = em.createQuery("select DISTINCT o from Order o inner
joinfetch o.orderItems order by o.orderid");
       List result = query.getResultList();
        return result;
    }

 

 

分享到:
评论

相关推荐

    Hibernate ORM - 一对多双向关联关系

    标题“Hibernate ORM - 一对多双向关联关系”指的是在数据库建模中,Hibernate ORM(对象关系映射)框架如何处理一个实体类(如User)与多个实体类(如Article)之间的关系。在这种关系中,一个用户可以拥有多个文章...

    JPA_2_一对多双向关联关系

    总的来说,理解并正确实现JPA 2中的一对多双向关联关系对于进行ORM开发至关重要。这种关系模式广泛应用于各种业务场景,如用户角色管理、订单与商品等。通过熟练掌握这一知识点,开发者能够更有效地将数据库模型转换...

    hibernate一对多,多对一,一对多双向关联

    标题"hibernate一对多,多对一,一对多双向关联"指涉的是Hibernate框架中常见的关系映射概念。在数据库设计中,实体间的关系通常包括一对一(One-to-One)、一对多(One-to-Many)和多对一(Many-to-One)关系,而在...

    Hibernate双向一对多经典实例

    这个实例适合初学者学习,旨在帮助理解Hibernate如何处理双向一对多关系。通过实践,新手可以了解如何配置映射文件、定义实体类以及编写必要的数据库操作代码。对于经验丰富的开发者来说,此实例可能过于基础,但...

    mybatis系列三:一对多双向关联

    总之,MyBatis的一对多双向关联提供了丰富的数据模型映射能力,使得在Java对象和数据库表之间建立复杂关系变得更加容易。通过合理配置映射文件和Java实体,以及充分利用MyBatis提供的工具,可以高效地管理这些关联...

    Hibernate ORM - 一对多双向连接表关联关系

    “Hibernate ORM - 一对多双向连接表关联关系”这个标题指出我们要讨论的是Hibernate ORM框架中的一种特定数据库关联模型,即一对多的双向关联。在Hibernate中,ORM(对象关系映射)是一种技术,它允许我们用面向...

    hibernate一对多双向

    在探讨“Hibernate一对多双向”这一主题时,我们首先需要理解Hibernate框架以及它在Java开发中的重要性。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用程序提供了一种将对象模型与数据库模型相...

    Hibernate ORM - 一对多双向组合关联关系

    **标题解析:** "Hibernate ORM - 一对多双向组合关联关系" 这个标题表明我们要讨论的是Hibernate ORM框架中的一种特定的数据关系映射——一对多双向组合关联。在关系型数据库中,一对多关联意味着一个父实体可以与...

    Hibernate双向一对多

    描述提到这是一个已经成功运行的项目,目的是为了便于学习者更好地理解和实践Hibernate双向一对多的关系映射。通过实际的项目案例,学习者可以直观地看到配置、实体定义、DAO操作以及Service层的实现,从而加深对这...

    Hibernate一对多双向自身关联demo代码

    在这个“Hibernate一对多双向自身关联demo代码”中,我们将深入理解如何实现一个实体类与其自身进行一对多的双向关联。这种关联在实际应用中常见于例如用户的朋友关系、员工的上下级关系等场景。 首先,让我们了解...

    JPA中的一对多双向关联与级联操作

    这篇博客将深入探讨JPA中的一对多双向关联以及级联操作。 首先,让我们理解一对多关联。假设我们有两个实体,一个是`User`(用户)和一个是`Post`(帖子)。一个用户可以发布多个帖子,但一个帖子只能属于一个用户...

    hibernate双向一对多增删查改的例子

    在Java的持久化框架Hibernate中,双向一对多关联是一种常见的数据模型关系,它涉及到两个实体类,一个实体可以有多个另一个实体的实例。本示例将深入探讨如何使用Hibernate进行双向一对多关系的增删查改操作。 首先...

    hibernate外键实现一对一双向关联关系源码

    一对一双向关联关系指的是两个实体类之间存在一对一的关系,且在各自的类中都可以直接访问对方。这种关联可以通过注解或XML配置来实现。在Hibernate中,通常使用`@OneToOne`注解来定义一对一关系,而双向关联则意味...

    多对一双向关联(视频)

    通过学习和掌握多对一和一对多双向关联,开发者可以更好地设计和实现复杂的数据库模型,并有效地使用ORM工具将这些模型映射到实际的数据库操作中。理解这些关联的概念对于开发高效、可维护的Java应用至关重要。

    hibernate3.2级联关系自身一对多双向关联

    理解并熟练掌握Hibernate 3.2中的级联关系和自身一对多双向关联,对于开发人员来说至关重要,它能够帮助编写更简洁、高效的代码,减少数据库操作中的错误。在实际项目中,这种关联模式常用于构建社交网络、组织结构...

    Hibernate Annotation 基于外键的一对多双向关联

    在实现基于外键的一对多双向关联时,理解注解的含义和作用至关重要,同时还需要考虑性能优化和潜在的问题,确保数据的正确性和一致性。通过阅读源码和实践,我们可以更深入地掌握Hibernate的内在机制。

    Hibernate教程12_关系映射之一对多(多对一)双向关联

    总的来说,掌握Hibernate的一对多双向关联是提升Java开发能力的关键一步,它能够帮助你更好地理解和处理复杂的数据库交互。在实际项目中,理解并灵活运用这种关系映射,可以提高代码的可读性和维护性,同时也能够...

    多对一双向关联关系实现源码

    本篇文章将详细讲解如何在Hibernate中实现多对一双向关联关系,并通过源码分析加深理解。 多对一关联关系是指在数据库中,一个实体(表)可以与多个其他实体(表)相关联,而另一个实体则对应于前者的多个实例。...

Global site tag (gtag.js) - Google Analytics