`

ManyToOne 双向一对多关系

 
阅读更多

双向一对多关系,一是关系维护端(owner side),多是关系被维护端(inverse side)。在关系被维护端需要通过@JoinColumn建立外键列指向关系维护端的主键列

 
 
publicclass Order implements Serializable {
    privateSet<OrderItem> orderItems = new HashSet<OrderItem>();
         。。。。
    @OneToMany(mappedBy="order",cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @OrderBy(value = "id ASC")
    public Set<OrderItem> getOrderItems() {
        returnorderItems;
     }
}
 
publicclass OrderItem implements Serializable {
private Order order;
。。。。
    @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.EAGERFetchType.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 时, 关系被维护端可以不存在,查询的结果仍然会返回关系维护端,在关系维护端中指向关系被维护端的属性为nulloptional属性的默认值是trueoptional 属性实际上指定关联类与被关联类的join 查询关系,如optional=false 时join 查询关系为inner join, optional=true 时join 查询关系为left join。下面代码片断解释如下:
 
 
 
 
 
有一点需要强调:当业务方法需要把一个实体Bean作为参数返回给客户端时,除了实体Bean本身需要实现Serializable 接口之外,如果关联类(OrderItem)是延迟加载,还需在返回实体Bean之前通过访问关联类的方式加载关联类(见下例)。否则在客户端访问关联类时将会抛出加载例外。
    public Order getOrderByID(Integer orderid) {
        Order order = em.find(Order.class, orderid);        
       //!!!!!因为是延迟加载,通过执行size()这种方式获取订单下的所有订单项
        order.getOrderItems().size();
       return order;
     }
 
另外不管是否延迟加载,通过join fetch 关联语句都可显式加载关联类,如下例:
 
    public List getAllOrder() {
         Query query = em.createQuery("select DISTINCT o from Order o inner
join fetch o.orderItems order by o.orderid");
         List result = query.getResultList();
        return result;
     }
分享到:
评论

相关推荐

    Hibernate双向一对多经典实例

    双向一对多关系意味着一个实体可以拥有多个相关联的实体,同时每个相关联的实体也可以回指到原始实体。 **描述:“入门时自己根据资料写的一个实例,仅供新手参考,资深者莫下!”** 这个实例适合初学者学习,旨在...

    Hibernate双向一对多

    在Hibernate中,双向一对多关系意味着两个实体类之间存在一对多的关系,并且双方都能感知到这种关系。例如,一个班级(Class)可以包含多个学生(Student),同时一个学生也属于一个班级。在这种关系中,Class是多的...

    JPA_2_一对多双向关联关系

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

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

    本示例将深入探讨如何使用Hibernate进行双向一对多关系的增删查改操作。 首先,让我们理解一下这种关系。假设我们有两个实体,一个是"学生"(Student)实体,另一个是"课程"(Course)实体。在现实生活中,一个学生可以...

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

    在数据库设计中,一对多关系意味着一个表的记录可以与另一个表的多个记录相关联。在Hibernate中,这种关系可以通过`@OneToMany`注解实现。例如,User类可能会有如下注解: ```java @Entity public class User { @...

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

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

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

    一对多关系是数据库设计中常见的关系类型,一个实体可以与多个其他实体相关联。而双向关联意味着两个关联的类都可以访问彼此,即一个类的对象可以访问另一类的所有相关对象。 **描述解析:** 虽然描述部分为空,但...

    hibernate双向一对多关联映射(注解版)

    在数据库设计中,一对多关系意味着一个表(父表)的记录可以与多个其他表(子表)的记录相关联。在Hibernate中,这通常通过在父类和子类中添加相互引用的@OneToMany和@ManyToOne注解来实现。 对于"hibernate双向一...

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

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

    jpa--11.双向一多

    **JPA 双向一对多关系详解** 在Java Persistence API(JPA)中,数据建模是通过实体类和它们之间的关联来实现的。在实际的业务场景中,经常会出现两个实体之间存在一对多(One-to-Many)的关系,比如一个用户可以有...

    博客(GreenDao一对多关系操作)的示例demo

    **博客GreenDao一对多关系操作示例Demo** 在Android应用开发中,数据库管理是一个不可或缺的部分。GreenDao是一款高效、轻量级的对象关系映射(ORM)框架,它使得Java对象和SQLite数据库之间的交互变得简单。本示例...

    SSH一对多(两表双向关联查询)

    通常情况下,一个人可能属于一个或多个组织,而一个组织也可以包含多个人员,这就构成了数据库设计中的一对多关系。在Hibernate中,我们可以使用`@ManyToOne`和`@OneToMany`注解来定义这种关联。 在`person`实体类...

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

    在Java的持久化框架Hibernate中,一对多关系是常见的实体关联类型,特别是在处理数据库中的表与表之间的关联时。在这个“Hibernate一对多双向自身关联demo代码”中,我们将深入理解如何实现一个实体类与其自身进行一...

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

    在Java Persistence API (JPA) 中,一对多关联是一种常见的关系映射,它表示一个实体可以与多个其他实体相关联。这种关联在数据库层面通常通过外键实现,而在JPA中,我们通过注解来配置这种关系。这篇博客将深入探讨...

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

    本教程主要聚焦于Hibernate中的关系映射,特别是"一对多"(多对一)的双向关联。在数据库设计中,这种关系映射非常常见,比如一个用户可以有多个订单,而每个订单对应一个用户。 首先,我们需要理解"一对多"(One-...

    hibernate 映射-一对多双向

    在Hibernate中,一对多关联是指一个实体(类)可以对应多个其他实体(类),例如,一个用户可以拥有多个订单,这就是一对多关系。双向一对多关联意味着两个实体之间都有引用,即用户类中可以有订单列表,而订单类中...

    Hibernate关于注解的一对多,多对多,一对一

    ### 一对多关系 在现实生活中,例如一个班级有一个班主任,而班主任可以管理多个学生,这就是典型的“一对多”关系。在Hibernate中,我们可以使用`@OneToMany`注解来表示这种关系。 1. **@OneToMany** 注解:这个...

    一对多单向和双向映射

    总结,一对多单向和双向映射是ORM框架中处理数据库关系的重要方式,它们各有优缺点,需要根据实际需求和项目规模来选择合适的设计。理解并熟练运用这些映射技术,对于提升Java应用程序的数据操作效率和代码质量具有...

Global site tag (gtag.js) - Google Analytics