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

一对多关系[转]

阅读更多
知识点:双向一对多关系,一是关系维护端(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.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 查询关系为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;
    }
分享到:
评论
1 楼 wuzhihui001 2012-05-28  
双向一对多关系,一是关系维护端(owner side),多是关系被维护端(inverse side)

你搞反了??

相关推荐

    JPA一对一,一对多,多对多关系映射

    **概念**:一对多关系表示一个实体可以与多个其他实体相关联,比如一个用户可以有多个订单。在数据库中,这通常通过在多方实体的表中添加外键实现。 **配置方式**: - 在一方实体上使用`@OneToMany`注解,表示一个...

    [详细完整版]20数据库.doc

    一对多关系转换:将一方的主键放到多放的关系中做外键 多对多关系转换:建立一个新的关系将两个关系的主键放到新的关系中做外键 安装软件RDBMS的路径 创建数据库 全局数据库名和sid 数据库文件目录 sys和system用户...

    hibernate一对多关系

    在这个"hibernate一对多关系"的资源中,我们主要探讨的是Hibernate如何处理一个实体类与多个实体类之间的关联关系。 在数据库设计中,一对多关系是非常常见的一种关系类型,比如一个部门可以有多个员工,一个学生...

    一对多虚拟串口

    下面我们将深入探讨一对多虚拟串口的工作原理、应用领域以及实现方法。 1. **工作原理** 一对多虚拟串口通过软件模拟多个串口,这些虚拟串口与物理串口之间建立连接。当物理串口接收到数据时,软件会将这些数据...

    数据库系统概论课后习题答案

    2. **一对多关系**:两个实体集之间的一种常见联系,其中一个实体集中的每一个实体可以和另一个实体集中任意个数(包括零个)的实体相联系。 3. **多对多关系**:两个实体集之间的一种复杂联系,其中两个实体集中的...

    图书馆管理系统数据库设计.docx

    - **原则3(一对多关系转换)**: 在一对多的关系中,通常只需要保留多方的一端作为一个关系模式,并在该模式中添加一方的主键作为外键。 - **原则4(多对多关系转换)**: 对于多对多的关系,需要创建一个新的关系...

    数据库大作业期末.pdf

    在这一阶段,我们需要定义表的字段,如学生的学院编号和所在专业,这可能是从“所属院系”的一对多关系转换而来。 物理结构设计涉及到表的细节,如字段的数据类型、长度、是否允许为空,以及可能的索引设计。例如,...

    Hibernate映射关系一对多

    在Hibernate的`hbm.xml`文件中,我们可以使用`&lt;set&gt;`元素来表示一对多关系。`&lt;set&gt;`元素代表一个集合,它包含了与父对象相关联的多个子对象。例如,对于学生和课程的关系,学生类的映射文件中会有如下配置: ```...

    SSM框架下的一对多和多对一查询

    一对多关系指的是一个实体可以拥有多个关联的实体,比如一个学生可以有多个课程,多对一则是反过来,多个实体对应一个实体,例如多个学生可以对应一个班主任。在MyBatis中,我们可以通过配置XML映射文件来实现这些...

    《一头扎进MyBatis3》第五讲 一对多关系的实现

    在数据库中,如果一个表(如班级表)的一条记录对应另一个表(如学生表)的多条记录,那么我们就说存在一对多关系。例如,班级表有一个班级ID,而学生表中有对应的班级ID,这样就建立了两个表之间的关联。 在...

    hibernate一对一关联关系

    在实体类之间,Hibernate支持多种关联关系,包括一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)。本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,...

    ssm 一对一 一对多demo

    然而,这种方式可能不够直观,尤其是当结果集包含复杂的一对一或一对多关系时,理解起来会比较困难。 在实际项目中,我们通常推荐创建专门的Dto(Data Transfer Object)类来封装查询结果,这样不仅可以保持代码的...

    hibernate一对多案例

    本案例主要探讨的是Hibernate中的一对多关系映射,这是一种常见的对象关系映射(ORM)配置,用于表示一个实体与多个其他实体之间的关联。 在传统的数据库设计中,一对多关系是指一个表(父表)中的记录可以与另一个...

    Hibernate之关联关系映射(一对多和多对一映射,多对多映射).docx

    `表示一个部门可以拥有多个员工,这是一个一对多关系。而在`Employee`类中,`private Dept dept;`表示一个员工隶属于一个部门,这是多对一关系。在映射配置文件中,需要使用`@OneToMany`和`@ManyToOne`注解来指定...

    MyBatis高级映射(一对多查询)

    在数据库关系模型中,一对多关系是常见的关联类型,例如一个学生可以对应多个课程,一个部门可以有多个员工等。MyBatis提供了一对多映射功能,使得在Java对象中可以直接获取到这种关联关系的数据。 1. **配置一对多...

    MyBatis 多表查询之一对多、多对一、多对多以及数据库资料.rar

    在数据库设计中,一对多关系意味着一个父表记录可以与多个子表记录相对应。在MyBatis中,可以通过在Mapper XML文件中配置`&lt;select&gt;`标签,使用`collection`属性来指定映射到的集合属性,通过`foreach`标签遍历子表...

    hibernate基于主外键的一对多/多对一关联

    例如,一个用户可以有多个订单,那么用户实体(User)与订单实体(Order)之间就存在一对多关系。在Java类设计时,User类会有一个Order类型的集合属性,如`List&lt;Order&gt; orders`,并在User类上使用`@OneToMany`注解来...

    mybatis一对一,一对多

    在测试中,你可以创建类似 `mybatis0408` 这样的例子,模拟不同的一对一和一对多关系,通过运行 SQL 并观察返回的结果,以加深对这两个标签的理解。 总之,掌握 MyBatis 的 `association` 和 `collection` 使用,...

    hibernate 一对一 多对多的关系

    例如,在处理上述的一对一和多对多关系时,Hibernate会根据注解自动处理关联的建立和删除。通过阅读源码,你可以了解这些过程的细节,这对于优化性能和解决复杂问题非常有帮助。 至于**工具应用**,Hibernate提供了...

Global site tag (gtag.js) - Google Analytics