企业级开发ORM对象映射

上传人:沈*** 文档编号:247323348 上传时间:2024-10-17 格式:PPT 页数:50 大小:2.12MB
返回 下载 相关 举报
企业级开发ORM对象映射_第1页
第1页 / 共50页
企业级开发ORM对象映射_第2页
第2页 / 共50页
企业级开发ORM对象映射_第3页
第3页 / 共50页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第三章,实体Bean与ORM关系对象映射,课程内容,实体与实体Bean的概念,实体Bean的开发,JBoss数据源的配置,单表映射的实体Bean的开发,对象/关系映射,EntityManager API以及实体Bean的生命周期,一对一、一对多、多对一、多对多,组合主键的概念,MDB组件及开发,概述,提供标准的O/R Mapping。,JPA没有同Java EE容器绑定在一起。,定义了服务提供者接口(SPI)。,实体不同于实体Bean,它们是不同的对象。而且,实体也不是实体Bean的后续产物,它是一种全新的编程概念,在Java持久化API(Java Persistence API,JPA)规范中定义了以下内容:,实体,实体同Session Bean的差异如下:,实体存在客户可见的、持久化身份(主键),实体存在持久化、客户可见的状态,不能够直接通过远程访问到实体,实体的生命周期可能与应用本身的生命周期无关,实体:,在JPA规范中持久化数据对象就是实体。,通过持久化机制能够将Java对象存储到持久化源中,这类对象表示数据,无论是简单的或者是复杂的,持久化数据对象都能够表示。,实体类,实体中常用到的注释:,Entity,注释:将类标识为,JPA,实体。,Table,注释:指定实体的主表,Id,注释:实体必须声明主键,GeneratedValue,注释:指定主键的生成策略。,Column,注释:指定持久化属性或者是成员变量映射到的列。,Temporal,注释:指定将成员属性和成员变量持久化为时间类型。,实体类:,实体类类似于其它EJB组件,它们也是POJO类,存在元数据注释,可以使用XML部署符定义它们。,实体BEAN的组成文件,java:/DefaultMySqlDS,一个实体Bean由实体类和persistence.xml配置文件组成,该文件要创建在Ejb-jar文件的META-INF目录下,persistence.xml指定实体Bean使用的数据源和及EntityManager对象的默认行为。,persistence.xml文件的配置说明如下所示:,实体BEAN的开发,在开发实体,Bean,的时候主要的工作是对实体类的代码编写工作。让我们看一个,Customer,实体的简单例子:,import javax.persistence.*;,Entity,public class Customer,private int id;,private String name;,Id,GeneratedValue,public int getId()return id;,public void setId(int id)this.id=id;,String getName()return name;,public void setName(String name),this.name=name;,JBoss数据源的配置,注意:数据源文件配置好后需要放置在JBoss安装目录“/server/config-name/deploy”目录下,我们之前安装JBoss时采用config-name为:“default”,所以路径为:JBoss安装目录“/server/default/deploy”目录。,JBoss有一个默认的数据源DefaultDS,它使用JBoss内置的HSQLDB数据库。,实际应用中我们可能使用不同的数据库,如常用的MySql、Ms SQL Server、Oracle等等。,各种数据库的数据源配置模板我们可以在JBoss安装目录“/docs/examples/jca”目录下找到,可以发现配置文件的默认名称规则是:“数据库名+-ds.xml”。,EntityManager API与实体BEAN的生命周期,EntityManager的获取可以通过PersistenceContext 注释由EJB容器动态注入,例如:,PersistenceContext(unitName=”MyDatabase”),EntutyManager em;,EntityManager API:,EntityManager是应用访问持久化上下文中的实体的接口,顾名思义,EntityManager是管理所有EJB3.0运行环境中的所有的Entity。,EntityManager根据运行的环境不同分为容器管理的EntityManager和应用管理的EntityManager。,EntityManager常用的API,实体获取,find(),实体添加,persist(),实体更新,merge(),实体删除,remove(),执行,EJB3 QL,操作,createQuery,(),刷新,flush(),实体BEAN的生命周期,新建(,new,),此时,在内存中已经创建了实体实例。,受管(,managed,),此时,实体已经在数据库中存在了持久化身份。,分离(,detached,),此时,实体具有持久化身份,但它不再同持久化上下文关联了。,删除(,removed,)此时,实体同持久化上下文进行了关联,但是客户已经打算从数据库中销毁这一实体了。,单表映射的实体BEAN,表3-1需要映射的数据库表,字段名称,字段类型属性,描述,personid(主键),Int(11)not null,人员ID,personName,Varchar(32)not null,姓名,sex,Tinyint(1)not null,性别,age,Smallint(6)not null,年龄,birthday,Datetime null,出生日期,对象/关系映射,下面给出了各种常见的关系类型:,1,:,1,关系,,此时,一条记录仅仅会同一条记录进行关联。比如人和身份证号这这种关系。,1,:,N,关系,,,一条记录会同许多其它的记录进行关联。比如经理和其职员构成了这种关系。,M,:,1,关系,,此时,多条记录会同一条记录进行关联。比如银行账号和人构成了这种关系。,M,:,N,关系,,多条记录同许多其它的记录进行关联。比如作家和杂志社就构成了这种关系。,一对一映射,关系实例:,Person:Idcard,Car:Windshield,Order:Shipment,一个Demo:以Person和Idcard为例,定义一个Session Bean作为它的使用者。下面是Session Bean的业务接口,它定义了四个业务方法,其业务功能分别是:,insertPerson():添加一个人员到数据库。,getPersonById():获取指定编号的人员。,updatePersonInfor():更新人员的信息。,deletePerson():删除人员,连同身份证一同删除。,字段名称,字段类型属性,描述,Id(主键),Int(11)not null,流水号,cardNum,Varchar(18)not null,身份证号,personid,Int(11)not null,外键指向person表的personid,字段名称,字段类型属性,描述,personid(主键),Int(11)not null,人员ID,personName,Varchar(32)not null,姓名,sex,Tinyint(1)not null,性别,age,Smallint(6)not null,年龄,birthday,Datetime null,出生日期,表3-2 Person表:,表3-3 Idcard表:,OneToOne,OneToOne注释:,用途:,定义1:1关系中的另一单值对象。通常是从被引用的就可以判断出目标实体,因此开发者不需要显式的指定目标实体。,成员:,Class targetEntity(),指定目标实体。,CascadeType cascade(),指定级联到目标实体的操作类型,相应的操作类型有:ALL、PERSIT(级联新建)、MERGE(级联更新)、REMOVE(级联删除)、REFRESH(级联刷新),ALL同联合使用其它四个属性效果一样。,FetchType fetch(),指定成员变量或者是属性是否立即加载还是延迟加载。,boolean optional(),指定关联是否可以为空,默认值为true。,String mappedBy(),指定拥有关系的属性,只需要在关联的反向(非拥有者)一端指定使用mappedBy成员。,一对多及多对一映射,一对多及多对一映射:,关系实例:,CustomerOrder,CompanyEmployee,ClassStudent,一个Demo:,以OrderItem和Order,为例,定义一个Session Bean来访问上面的实体Bean,下面是我们定义的业务接口,它定义了三个业务方法,分别是:,insertOrder,:添加一个定单(带两个定单项)进数据库。,getOrderById,:获取指定定单号的定单。,getAllOrder,:获取所有定单。,OneToMany注释,OneToMany注释:,用途:,定义1:N关系中的多值关联。,成员:,Class targetEntrty(),指定目标实体,定义关系类的类型,默认是成员属性对应的类类型,所以通常不需要提供定义。,String mappedBy(),定义类之间的双向关系,如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义,否则可能引发数据不一致的问题。,CascadeType cascade(),该属性成员定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联对象采取相同的操作,而且这种关系是递归调用的。,FetchType fetch(),指定属性或者是成员变量的值是否立即装载,还是延迟装载。可选项包括:FetchType.EAGER和FetchType.LAZY。前者表示立即装载,后者表示延迟。,多对多映射,多对多映射,:,关系实例:,学生-老师,卖家-买家,在实体Bean的代码设计中如果要用到多对多的映射,我们除了像其它类型的映射所做的那样(使用Entity注释和Table注释)之外,相信大家也能够猜到标识多对多的映射注释:ManyToMany注释。,下面我们就详细的讲解一下该注释的具体用法。,ManyToMany注释,ManyToMany注释:,用途:,定义M:N关系中的多值关联。如果使用泛型定义Collection参数化类型,则不用指定关联的目标实体类。每个M:N关系都存在两端:拥有方和非拥有方,或称之为反向端。中间表是在拥有方指定的。如果是双向关系,则每一方都可以成为拥有方。,成员:,Class targetEntity(),指定目标实体(如果使用泛型它将使用Collection参数化类型);,CascadeType cascade(),指定级联到目标实体的操作类型。类型的参数同样有ALL、PERSIT、MERGE、REMOVE、REFRESH参数意义同一对一当中的cascade中的参数意义相同。,FetchType fetch(),指定属性或者是成员变量的值是否立即加载或者是延迟加载。,String mappedBy(),指定拥有关系的属性,如果关系不是单向的,则必须给出相应的取值。,组合主键,在EJB3中定义了两种主键:,(1)简单主键,(2)复合主键,复合主键类的编写需要符合以下一些要求:,复合主键类必须是public和具备一个没有参数的constructor。,复合主键类的每个属性变量必须有getter/setter,如果没有,每个属性变量则必须是public或者protected。,复合主键类必须实现。,复合主键类必须实现equals()和hashcode()方法。,复合主键类中的主键属性变量的名字必须和对应的Entity中主键属性变量的名字相同。一旦主键值设定后,不要修改主键属性变量的值。,什么是消息,消息,是软件组件或应用之间的
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!