`
loveExtJs
  • 浏览: 15677 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

【转载】JPA关联关系与EJB

阅读更多
今天内容为两个版块JPA与EJB,从学习hibernate、UML到JPA。他们都涉及到一个极为重要的细节——类与类、接口与接口或类与接口之间的四类关联关系。今日上午到下午3点左右内容为JPA中处理这四类关系。我想我应该将他们系统的做一下总结,这项任务就留着后天休息来完成吧!

近三天的课程内容除了带给我知识上的获取和见识的增长,更让我感觉到一种力量!在学习WEB之前,这些互联网的东西让我满头雾水,不知所云。但在传智播客学习到现在,WEB应用中应该没什么还能让我满头雾水的了,云计算也没之前那么让我感到神秘的。带给我什么力量了?一种驾驭知识的力量!我十分有兴与两位高手租房子,我从他们身上学习到了很多知识。因为我没读过本科,所以计算机基础知识不够好。偶有时间,看一看计算机组成原理等。通过与同学的交流,我似乎已经能摸清硬件了执行原理,并不复杂。

通过以前的工作自己掌握的知识、在传智播客学习到的知识,以及与同事、好友、同学们的相处。我似乎已经感觉到将硬件、桌面应用、WEB应用...融汇贯通的感觉!这感觉让我充满力量。

一、JPA中的关联关系

说实在的在学习hibernate和UML时,听着老师讲关联关系一点问题都没有。但他们在我脑子里没形成系统的概念。但今天学习JPA的关联关系,让我找到了感觉。关系关联在我脑子里形成系统的概念,指日可待!

1.一对多单向关联

典型的例子是,客户与订单这种一对多的关系。在客户类的orders属性或getOrders属性方法上添加注解:

@OneToMany(fetch=FetchType.EAGER,

   cascade={CascadeType.PERSIST,CascadeType.REMOVE},

   targetEntity=Order.class)

“@OneToMany”表示一对多关联关系的注解,括号内全是他的属性。

“fetch=FetchType.EAGER”,强迫左外连接,默认值为“LAZY”。

“cascade={CascadeType.PERSIST,CascadeType.REMOVE}”,设置保存和删除级联。

“targetEntity=Order.class”,相当于hibernate的class属性。

2.多对一单向关联

订单与客户的例子。在订单类的customer属性或getCustomer属性方法上添加注解:

@ManyToOne(cascade={CascadeType.PERSIST})

@JoinColumn(name="cid")

“@ManyToOne”表示多对一的关联关系的注解,括号内全是他的属性。

“cascade={CascadeType.PERSIST}”设置保存级联。

“@JoinColumn”设置Orders表的外键。

“name="cid"”外键的名称。

3.一对多(多对一)双向关联

在客户类的orders属性或getOrders属性方法上添加注解:

@OneToMany(mappedBy="customer",

   fetch=FetchType.EAGER,

   cascade={CascadeType.PERSIST,CascadeType.REMOVE},

   targetEntity=Order.class)

在订单类的customer属性或getCustomer属性方法上添加注解:

在上面的注解中只“@OneToMany”中多了一个“mappedBy="customer"”属性,它相当于hibernate的“inverse=false”属性,不参与对集合的控制。如果不设置“mappedBy”属性,JPA会为一对多关联关系设置一个中间表。

4.一对一关联

使用学习hibernate时的例子,用户包含大文本信息的地址属性。

外键关联:

在用户表的Addr属性或getAddr属性方法上添加注解:

@ManyToOne(cascade={CascadeType.PERSIST})

@JoinColumn(name="cid")

“@OneToOne”为一对一关联关系注解。

“@JoinColumn”设置外键。

“name="aid"”外键名称为“aid”。

“unique=true”外键唯一性,用户与地址一一对应。

在地址表的User属性或getUser属性方法上添加注解:

@OneToOne

@JoinColumn(name="aid",unique=true)

“@OneToOne”为一对一关联关系注解。

“mappedBy="addr"”取消对集合的控制权,用User实体来控制外键的值。

主键关联:

在用户表的Addr属性或getAddr属性方法上添加注解:

“@OneToOne”为一对一关联关系注解。

“@PrimaryKeyJoinColumn”,设置主键关联列。

“name="userid"”,本实体关联字段的名称。

“referencedColumnName="addrid"”,所关联实体的表中的字段名称。

在地址表的User属性或getUser属性方法上添加注解:

@OneToOne(mappedBy="addr")

“@OneToOne”为一对一关联关系注解。

“mappedBy="addr"”取消对集合的控制权,用User实体来控制外键的值。

5.多对多关联

经典的例子,教师与学生多对多关联关系。

在Teacher实体的stus集合属性或getStus属性方法上添加注解:

@OneToOne

@PrimaryKeyJoinColumn(name="userid",referencedColumnName="addrid")

“@ManyToMany”设置多对多关联关系。

“@JoinTable”设置关联表。

“name="jpa_links"”中间表表名。

“joinColumns=@JoinColumn(name="tid")”设置Teacher实体对应的关联列。数组类型,可以设置多重主键。

“inverseJoinColumns=@JoinColumn(name="sid")”设置Student实体对应的关联列。数组类型,可以设置多重主键。

在Student实体的teas集合属性或getTeas属性方法上添加注解:

@OneToOne(mappedBy="addr")

“@ManyToMany”为多对多关联关系注解。

“mappedBy="addr"”取消对集合的控制权。

6.继承关系

继承关系有三种解决方法,我们仍然使用学习hibernate时所使用的例子。一个员工实体(Employee),一个钟点工子实体(HourlyEmployee)和一个薪水工子实体(SalaryEmployee)。

1).继承关系树对应一张表

在Employee实体类上面添加注解:

@ManyToMany

@JoinTable(name="jpa_links",

joinColumns=@JoinColumn(name="tid"),

inverseJoinColumns=@JoinColumn(name="sid"))

“@Entity”设置实体。

“@Table(name="jpa_inherit_single_ess")”设置表名。

“@Inheritance(strategy=InheritanceType.SINGLE_TABLE)”设置集成策略为单个表,将整个继承关系树保存在一张表中。

“@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)”设置区分器字段名称和类型。

“@DiscriminatorValue("ee")”Employee对应的区分类型值为“ee”。

在HourlyEmployee实体类上面添加注解:

@ManyToMany(mappedBy="stus")

“@Entity”设置实体。

“@DiscriminatorValue("he")”Employee对应的区分类型值为“he”。

在SalaryEmployee实体类上面添加注解:

@Entity

@Table(name="jpa_inherit_single_ess")

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)

@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)

@DiscriminatorValue("ee")

“@Entity”设置实体。

“@DiscriminatorValue("se")”Employee对应的区分类型值为“se”。

2).每个类对应一张表,使用外键关联。

在Employee实体类上面添加注解:

“@Entity”设置实体。

“@Table(name="jpa_inherit_join_ees")”设置表名。

“@Inheritance(strategy=InheritanceType.JOINED)”设置集成策略为联合,为继承关系树中每个成员创建一个表,并使用外键关联(父类的主键被做为子类的外键)。

在HourlyEmployee实体类上面添加注解:

@Entity

@DiscriminatorValue("he")

“@Entity”设置实体。

“@Table(name="jpa_inherit_join_hes")”设置表名。

“@PrimaryKeyJoinColumn(name="eeid")”设置外键。

在SalaryEmployee实体类上面添加注解:

@Entity

@DiscriminatorValue("se")

“@Entity”设置实体。

“@Table(name="jpa_inherit_join_ses")”设置表名。

“@PrimaryKeyJoinColumn(name="eeid")”设置外键。

3).联合表,每个类单独一个表,使用union联合。

在Employee实体类上面添加注解:

@Entity

@Table(name="jpa_inherit_join_ees")

@Inheritance(strategy=InheritanceType.JOINED)

“@Entity”设置实体。

“@Table(name="jpa_inherit_join_ess")”设置表名。

“@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)”设置集成策略为union,为继承关系树中的每个成员创建一张表,每个表包含全信息(子类表中包含父类属性的字段)。

在HourlyEmployee实体类上面添加注解:

“@Entity”设置实体。

在SalaryEmployee实体类上面添加注解:

@Entity

@Table(name="jpa_inherit_join_hes")

@PrimaryKeyJoinColumn(name="eeid")

“@Entity”设置实体。

二、EJB3简介

在本文中将对新的规范进行一个概要性的介绍,包括新增的元数据支持,EJBQL的修改,实体Bean模型访问bean上下文的新方法和运行时环境等等。作者还讨论了EJB在未来要作出的调整以及EJB3.0与其他开发规范之间的关系。

来自:http://developer.51cto.com/art/200510/6284.htm

三、EJB3“HelloWorld!”

我们使用EJB3编写一个“HelloWorld!”程序:

一、配置JBOSS服务器

1.我们使用的是“jboss-4.2.2.GA”。

2.将“jboss-4.2.2.GA”放置在非中文路径目录。、

3.添加环境变量“JBOSS_HOME”,值为“jboss-4.2.2.GA”所在目录。

4.修改JBOSS服务器端口,配置文件为“jboss-4.2.2.GA\server\default\deploy\jboss-web.deployer\server.xml”。将其中的8080端口修改为8088端口。

5.在IDE中配置JBOSS服务器,指定JBOSS4.X服务器所在目录。

二、EJB组件

1.创建一个普通Java工程,命名为“EJB3_HW_EJB”。

2.将hibernate3.1目录下的“jpa”子目录中的所有jar包导入到工程。

3.在工程中添加一个接口“cn.itcast.cc.ejb3.ejb.HelloWorld”:

@Entity

@Table(name="jpa_inherit_join_ses")

@PrimaryKeyJoinColumn(name="eeid")

4.编写一个“HelloWorld”接口的实现类“cn.itcast.cc.ejb3.ejb.HelloWorldImpl”:

@Entity

@Table(name="jpa_inherit_join_ess")

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

@Entity

5.将工程“EJB3_HW_EJB”导出为“EJB3_HW_EJB.jar”包。

6.将“EJB3_HW_EJB.jar”拷贝到“JBOSS”的“\server\default\deploy”目录下,JBOSS服务器会自动部署。

三、WEB应用

1.创建一个WEB应用工程,命名为“EJB3_HW_WEB”。

2.将上边的EJB组件工程“”添加为WEB应用工程的Required Project。(在“Configure Build Path”中设置)

3.将“index.jsp”页面的内容设置为:

@Entity

import javax.ejb.Local;

@Local

public interface HelloWorld {

String hello(String str);

}

import javax.ejb.Stateless;

@Stateless

public class HelloWorldImpl implements HelloWorld {

public String hello(String str) {

System.out.println(str);

return "Hello "+str+" ,welcome to EJB3!";

}

}

4.将工程“EJB3_HW_WEB”导出为“EJB3_HW_WEB.war”包。

5.将“EJB3_HW_WEB.war”拷贝到“JBOSS”的“\server\default\deploy”目录下,JBOSS服务器会自动部署。

四、运行

1.在IDE中启动JBOSS服务器。

2.打开浏览器。

3.输入URL“http://localhost:8088/EJB3_HW_WEB/index.jsp”。

4.在输出容器中输出:“23:15:51,683 INFO  [STDOUT] changcheng”。

5.在JSP页面中输出:“Hello changcheng ,welcome to EJB3! ”

OK,今天的内容到此结束!
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    JPA学习笔记-EJB-04JPA关联映射总结

    本篇笔记主要聚焦于JPA的关联映射,这是JPA中一个重要的概念,用于定义实体之间的关系。 关联映射允许我们将数据库中的表关系映射到Java对象的关联上。在Hibernate中,这些关系通常通过XML配置文件来定义,而在JPA...

    EJB学习大全(EJB3.0实例教程 JPA教程 实战EJB)

    5. **持久化框架(Persistence Framework)**:EJB3.0引入了JPA(Java Persistence API),提供了一种标准的方式来管理和操作数据,与ORM工具如Hibernate集成。 **JPA教程**: JPA是Java平台上的持久化规范,它允许...

    JPA关联关系

    在JPA中,关联关系是实现对象与数据库表之间映射的关键部分,它允许我们将数据库中的表与Java类之间的关系映射出来。本文将深入探讨JPA中的四种主要关联关系:一对一(OneToOne)、一对多(OneToMany)、多对一...

    JPA内嵌EJB

    Java Persistence API(JPA)是Java平台上的一个标准,用于管理关系数据库中的数据。它提供了一种面向对象的方式来处理数据库操作,使得开发人员可以使用Java对象来操作数据库记录,而无需编写大量的SQL代码。JPA的...

    SSH框架和JPA+EJB+JSF框架的比较

    #### 五、EJB与Spring对比 - **EJB**:虽然EJB提供了强大的企业级服务支持,如事务管理、消息驱动组件等,但由于其复杂的API和配置要求,使得学习和维护成本较高。 - **Spring**:相比之下,Spring框架以其轻量级...

    ejb3 jpa初探

    本篇文章将深入探讨ejb3与JPA的关系,以及如何在实际项目中使用它们。 ### JPA概述 Java Persistence API是Java EE平台的一部分,它提供了一套标准API,用于在Java应用程序中实现ORM。JPA允许开发者使用面向对象的...

    JPA/JBOSS/EJB基础教程PDF资料

    综合来看,"JPA/JBOSS/EJB基础教程PDF资料"这套资源将帮助初学者理解并掌握Java企业级开发的核心技术,包括对象关系映射、组件化开发以及应用服务器的使用。通过学习EJB 3和JBoss 4.0,开发者可以了解如何在现代企业...

    JPA学习笔记-EJB-02JPA属性注解

    ### JPA学习笔记-EJB-02JPA属性注解 #### 一、引言 在上一篇文章中,我们简要介绍了Java Persistence API (JPA)的基础知识,包括它的基本部署和操作流程,从而让我们对JPA有了初步的认识。本文将继续深入探讨JPA的...

    JPA学习源码(EJB实体Bean)

    在该上下文中,JPA会自动处理对象的状态(新建、持久化、已加载、已删除)以及对象间的关联关系。 5. **查询语言(JPQL,Java Persistence Query Language)**:类似于SQL,但面向对象,用于查询实体。JPQL支持复杂...

    JSF+EJB+JPA

    这是一个经典javaee项目,使用JSF+EJB+JPA框架来完成的一个基于网络聊天室的dnf拍卖系统,里面含有两个项目,从网络聊天室可以直接进入拍卖系统。

    JPA映射关系,多种映射关系的图解

    JPA映射关系,多种映射关系的图解,适合EJB初学者,对JPA映射关系的了解.

    JPA学习笔记-EJB-03JPA主键生成策略总结

    - `name`: 与`@GeneratedValue`中的`generator`属性关联,表示生成器的名称。 - `table`: 指定用于管理主键值的特殊表名称。 - `pkColumnName`: 特殊表中用于区分不同业务表的列名。 - `pkColumnValue`: 特殊表...

    拍卖系统jsf+ejb+jpa

    **JPA(Java Persistence API)** 是Java EE中用于对象关系映射(ORM)的标准,它允许开发者使用Java对象来操作数据库,而无需直接编写SQL语句。JPA通过注解或XML配置,将Java类映射到数据库表,使得对象可以透明地...

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

    一对一关系是指两个实体之间的关系,其中一个实体只能与另一个实体关联。在 JPA 中,使用 `@OneToOne` 注解来定义这种关系,并通过 `@JoinColumn` 注解指定关联字段。 **示例代码:** ```java @OneToOne @...

    基于JSF+EJB3+JPA的竞价拍卖系统

    在拍卖系统中,JPA负责将拍卖物品、用户、出价等业务对象与数据库表之间的映射,通过编写简单的实体类和配置,即可实现对象与SQL的透明转换。JPA提供了查询语言JPQL,类似于SQL,但更面向对象,方便对数据库进行复杂...

    jpa 关联映射jpa 关联映射jpa 关联映射

    在 JPA 中,实体之间的关联关系非常重要,因为它们描述了实体如何相互作用以及如何存储这些关系。本文将深入探讨 JPA 中的一对一 (One-to-One)、一对多 (One-to-Many)、多对一 (Many-to-One) 和多对多 (Many-to-Many...

    JPA-4 映射关联关系

    在这种关系中,一个实体("一"端)可以与多个其他实体("多"端)关联,但被关联的实体并不知道这个关联。在JPA中,我们通常在“多”端实体上定义`@ManyToOne`注解,指定关联的"一"端实体。同时,为了存储外键,我们...

Global site tag (gtag.js) - Google Analytics