第29章-JPA进阶课件

上传人:沈*** 文档编号:241601970 上传时间:2024-07-08 格式:PPT 页数:47 大小:875.50KB
返回 下载 相关 举报
第29章-JPA进阶课件_第1页
第1页 / 共47页
第29章-JPA进阶课件_第2页
第2页 / 共47页
第29章-JPA进阶课件_第3页
第3页 / 共47页
点击查看更多>>
资源描述
JavaEE实用教程(第二版)电子工业出版社李绪成第29章JPA进阶教材:JavaEE实用教程JavaEE实用教程(第二版)电子工业出版社李绪成主要内容v29.1主键生成策略v29.2复合主键v29.3嵌入式主键v29.4一对一关系的配置和使用v29.5多对一和一对多关系的配置和使用v29.6多对多的关系v29.7把查询的多个值封装成对象v29.8批量更新和删除v29.9使用存储过程v29.10实体生命周期回调方法JavaEE实用教程(第二版)电子工业出版社李绪成29.1主键生成策略v主键属性的值可以由用户指定,也可以根据一些特定的规则自动生成。具体如何生成由主键生成策略确定,使用GeneratedValue注释设置。vGeneratedValue有两个属性strategy和generator,作用如下:strategy,指出主键的生成策略,可选的值包括GenerationType.TABLE、GenerationType.SEQUENCE、GenerationType.IDENTITY和GenerationType.AUTO,默认值为GenerationType.AUTO。generator,指出主键生成器的名字,它的值根据不同的生成策略进行相应的设置,默认值是空字符串。JavaEE实用教程(第二版)电子工业出版社李绪成29.1.1采用表生成策略v在数据库中创建一张表来存放数据库表的主键,主键的值每次都是从指定的表中查询来获得。v为了使用表生成策略,需要先创建存储主键的表,多个表可以共享存储主键的表,存储主键的表至少应该包括两个列,分别存储主键的名字和主键的值。每个表的主键存储一行。v采用表生成策略,需要设置两个方面的内容:定义主键生成器,表生成策略使用TableGenerator定义;声明主键生成策略为表生成策略,并与之前定义的主键生成器关联。JavaEE实用教程(第二版)电子工业出版社李绪成29.1.1采用表生成策略v使用TableGenerator标记定义表生成策略,主要属性如下:name,该生成器的名字,在GeneratedValue中设置“generator”值使用的就是该名字;table,指出存储主键的表,在本例就是上面定义的id_table表;catalog和schema,存储主键的表所在的数据库catalog和schema名;pkColumnName,主键表中存储主键名的列的名字,在本例中就是“id_name”;valueColumnName,主键表中存储主键值的列的名字,在本例中就是“id_value”;pkColumnValue(),主键表中表示当前主键的主键名,在本例中就是“BOOK_ID”;initialValue,表示主键的初始值,默认值为0;allocationSize,表示每次主键增加的值的大小,如果设置为1,则每次加1,默认值为50;uniqueConstraints,与Table注释中的用法相同。JavaEE实用教程(第二版)电子工业出版社李绪成29.1.1采用表生成策略TableGenerator(name=book_gen,table=id_table,pkColumnName=id_name,valueColumnName=id_value,pkColumnValue=BOOK_ID,allocationSize=1)JavaEE实用教程(第二版)电子工业出版社李绪成29.1.1采用表生成策略JavaEE实用教程(第二版)电子工业出版社李绪成29.1.1采用表生成策略v29.1.1.2声明主键生成策略为表生成策略主键上通过GeneratedValue来设置主键生成策略,strategy属性的值设置为GenerationType.TABLE,generator属性的值设置前面定义的生成器book_gen。下面是具体的定义:IdGeneratedValue(strategy=GenerationType.TABLE,generator=book_gen)publicIntegergetId()returnthis.id;JavaEE实用教程(第二版)电子工业出版社李绪成29.1.1采用表生成策略v测试表生成策略创建表createtableuser(useridintprimarykey,usernamevarchar(20);执行添加操作Useruser=newUser();user.setUsername(lixucheng);em.persist(user);插入数据的时候不需要为主键列赋值JavaEE实用教程(第二版)电子工业出版社李绪成29.1.2自增主键vJPA的实现者将会根据不同的数据库类型来实现自增的策略。可以设置主键生成策略为AUTO,这样JPA会根据数据库类型进行选择。设置方式如下:IdGeneratedValue(strategy=GenerationType.AUTO)publicIntegergetId()returnthis.id;v使用自增字段,创建表的时候需要把主键设置为自增字段:createtableuser2(useridintauto_incrementprimarykey,usernamevarchar(20);JavaEE实用教程(第二版)电子工业出版社李绪成29.1.3SEQUENCE主键生成策略v自增主键在Oracle中可以使用Sequence来实现,如果实体要采用SEQUENCE主键生成策略,需要完成如下工作:定义主键生成器,采用SEQUENCE主键生成策略,需要使用SequenceGenerator注释;声明主键生成策略,并与主键生成器关联起来。JavaEE实用教程(第二版)电子工业出版社李绪成29.1.3SEQUENCE主键生成策略v29.1.3.1定义主键生成器使用SequenceGenerator注释声明主键生成器,属性有:vname,指出生成器的名字;vsequenceName,指出数据库中序列的名字;vinitialValue,表示主键的初始值,默认值为0;vallocationSize,表示每次主键增加的值的大小,如果设置为1,则每次加1,默认值为50。如果采用Oracle作为数据库,Book表的主键就可以设置为序列,假设序列名字为book_sequence。则主键生成器可以使用下面的代码定义。SequenceGenerator(name=book_sequence,sequenceName=book_sequence)JavaEE实用教程(第二版)电子工业出版社李绪成29.1.3SEQUENCE主键生成策略v29.1.3.2声明主键生成策略为序列生成策略在主键上把GeneratedValue的strategy属性的值设置为GenerationType.SEQUENCE,generator属性设置为book_sequence:GeneratedValue(strategy=GenerationType.SEQUENCE,generator=book_sequence)JavaEE实用教程(第二版)电子工业出版社李绪成29.1.4IDENTITY主键生成策略vSQLServer数据库支持使用Identity字段实现自增字段,可以采用IDENTITY主键生成策略。v采用IDENTITY主键生成策略可以使用下面的代码:GeneratedValue(strategy=GenerationType.IDENTITY)JavaEE实用教程(第二版)电子工业出版社李绪成29.2复合主键v复合主键由多个域组成,例如订单项的主键通常是由订单号和订单项号组成的,订单号和订单项号组成复合主键。v使用复合主键,需要完成的工作如下:定义主键类,应该包含主键所涉及的多个属性;在实体类上面声明主键类,然后在相应的主键属性上使用Id注释。JavaEE实用教程(第二版)电子工业出版社李绪成29.2复合主键v29.2.1定义主键类实例:publicfinalclassLineItemKeyimplementsjava.io.SerializablepublicIntegerorderId;publicintitemId;publicbooleanequals(ObjectotherOb)publicinthashCode()return(orderId=null?0:orderId.hashCode()(int)itemId);publicStringtoString()return+orderId+-+itemId;JavaEE实用教程(第二版)电子工业出版社李绪成29.2复合主键v29.2.1定义主键类主键类应该满足下面的要求:v必须实现Serializable接口。v必须有默认的public无参数的构造方法。v必须覆盖equals和hashCode方法。equals方法用于判断两个对象是否相同,EntityManger通过find方法来查找Entity时,是根据equals的返回值来判断的。hashCode方法返回当前对象的哈希码,生成的hashCode相同的概率越小越好,算法可以进行优化。JavaEE实用教程(第二版)电子工业出版社李绪成29.2复合主键v29.2.2声明实体类的主键类IdClass用于指定实体类中的主键类。IdClass(ch28.LineItemKey.class)Entity.publicclassLineItem.JavaEE实用教程(第二版)电子工业出版社李绪成29.2复合主键v29.2.2声明实体类的主键类LineItem中的两个域使用Id进行标识:IdpublicintgetItemId()returnitemId;.IdpublicIntegergetOrderId()returnorderId;JavaEE实用教程(第二版)电子工业出版社李绪成29.3嵌入式主键v29.3.1 主键类的定义主键类的定义嵌入式主键也必须实现Serializable接口、必须有默认的public无参数的构造方法、必须覆盖equals和hashCode方法。使用Embeddable注释来标识嵌入式主键类。EmbeddablepublicfinalclassLineItemKeyimplementsjava.io.SerializablepublicIntegerorderId;publicintitemId;JavaEE实用教程(第二版)电子工业出版社李绪成29.3嵌入式主键v29.3.2使用EmbeddedId声明嵌入式主键主键的声明如下:EmbeddedIdprivateLineItemKeyid;对主键属性的访问方法如下:publicintgetItemId()returnthis.id.itemId;publicvoidsetItemId(LongitemId)this.id.itemId=itemId;.JavaEE实用教程(第二版)电子工业出版社李绪成29.4一对一关系的配置和使用v实体之间的关系包括一对一、一对多、多对一和多对多4种。v实体之间的关系有双向和单向之分。v在数据库中一对一关系有3种表示方法:两个表采用相同的主键;一个表的主键作为另一个表的外键,同时外键需要设置唯一性约束。使用关联表建立两者之间的关系。v使用OneToOne注释声明一对一关系。JavaEE实用教程(第二版)电子工业出版社李绪成29.4.1OneToOne注释vOneToOne注释用于描述一对一关系,属性包括:cascade,用于设置级联操作的类型,描述对当前对象进行操作的时候是否对级联的对象进行操作,级联类型在CascadeType中定义,包括:vCascadeType.PERSIST,持久操作级联;vCascadeType.REMOVE,删除操作级联;vCascadeType.REFRESH,刷新操作级联;vCascadeType.MERGE,merge操作级联;vCascadeTpye.ALL,所有操作都会级联。JavaEE实用教程(第二版)电子工业出版社李绪成29.4.1OneToOne注释fetch,用于设置在加载当前对象的时候是否加载关联的对象,取值包括两个:vCascadeType.EAGER,当加载当前实体的时候,会加载相关的实体;vCascadeType.LAZY,当加载当前实体的时候,不会加载相关的实体,只有通过关联属性访问这个实体的时候才加载。v两种方式各有利弊,采用EAGER方式,一次加载数据,占用内存空间大,但是后续访问速度快,采用LAZY方式,需要的时候再加载对象,占用内存空间小,但是访问速度要慢。默认值为LAZY。JavaEE实用教程(第二版)电子工业出版社李绪成29.4.1OneToOne注释mappedBy,关联关系需要通过数据库中的外键设置,需要在拥有外键的一方设置,而另一方不需要设置,但是需要通过mappedBy指出设置的一方所设置的属性。例如,订单和订单项之间的关系是一对多的关系,在订单项一方要设置属性表示所属订单,并且要描述订单项中的外键,而在订单一方需要设置属性表示订单项的集合,不需要设置外键,但是需要使用mappedBy声明在订单项一方使用什么属性来描述订单和订单项之间的关系。JavaEE实用教程(第二版)电子工业出版社李绪成29.4.1OneToOne注释optional,定义该关联实体是否必须存在。如果设置为false,则关联实体必须存在,那么该属性就不能设置为null。默认值是true。targetEntity,声明关联实体的类型,默认情况下是关联属性的类型,如果不是关联属性的类型,可以通过该属性设置。JavaEE实用教程(第二版)电子工业出版社李绪成29.4.2使用共享主键实现一对一v共享主键需要使用PrimaryKeyJoinColumnBody类:OneToOne(cascade=CascadeType.ALL)PrimaryKeyJoinColumnpublicHeartgetHeart()returnheart;Heart类:IdpublicLonggetId().JavaEE实用教程(第二版)电子工业出版社李绪成29.4.3使用外键建立一对一关系v使用外键建立一对一关系,需要指出外键列,通过JoinColumn指出;v下面例子使用外键列进行实体的关联。假设Customer通过Customer表中名为的passport_fk外键列和Passport关联。JavaEE实用教程(第二版)电子工业出版社李绪成EntitypublicclassCustomerimplementsSerializableOneToOne(cascade=CascadeType.ALL)JoinColumn(name=passport_fk)publicPassportgetPassport().EntitypublicclassPassportimplementsSerializableOneToOne(mappedBy=passport)publicCustomergetOwner().JavaEE实用教程(第二版)电子工业出版社李绪成29.4.4通过关联表建立一对一关系v关联表中需要设置两个外键分别引用两个表;v使用JoinTable来表示这种关系,name属性指出关联表的名字,joinColumns的值是指向拥有关系的实体的外键列customer_fk,inverseJoinColumns的值是指向被引用的实体的外键列passport_fk。JavaEE实用教程(第二版)电子工业出版社李绪成EntitypublicclassCustomerimplementsSerializableOneToOne(cascade=CascadeType.ALL)JoinTable(name=CustomerPassportsjoinColumns=JoinColumn(name=customer_fk),inverseJoinColumns=JoinColumns(name=passport_fk)publicPassportgetPassport().EntitypublicclassPassportimplementsSerializableOneToOne(mappedBy=passport)publicCustomergetOwner().JavaEE实用教程(第二版)电子工业出版社李绪成29.5多对一和一对多关系vManyToOne注解来声明多对一关联,使用OneToMany注释声明多对一关系。使用外键连接Entity()publicclassFlightimplementsSerializableManyToOne(cascade=CascadeType.PERSIST,CascadeType.MERGE)JoinColumn(name=COMP_ID)publicCompanygetCompany()returncompany;.JavaEE实用教程(第二版)电子工业出版社李绪成29.5多对一和一对多关系v通过关联表的方式来映射。通过JoinTable注解可定义关联表:Entity()publicclassFlightimplementsSerializableManyToOne(cascade=CascadeType.PERSIST,CascadeType.MERGE)JoinTable(name=Flight_Company,joinColumns=JoinColumn(name=FLIGHT_ID),inverseJoinColumns=JoinColumns(name=COMP_ID)publicCompanygetCompany()JavaEE实用教程(第二版)电子工业出版社李绪成29.6多对多的关系v多对多关系通过ManyToMany注释定义。v多对多关系都有关联表,需要使用JoinTable描述关联表和关联字段。v如果是双向关联,其中一端使用JoinTable声明,另一方使用mappedBy属性。JavaEE实用教程(第二版)电子工业出版社李绪成EntitypublicclassEmployerimplementsSerializableManyToMany(targetEntity=org.hibernate.test.metadata.manytomany.Employee.class,cascade=CascadeType.PERSIST,CascadeType.MERGE)JoinTable(name=EMPLOYER_EMPLOYEE,joinColumns=JoinColumn(name=EMPER_ID),inverseJoinColumns=JoinColumn(name=EMPEE_ID)publicCollectiongetEmployees()returnemployees;.JavaEE实用教程(第二版)电子工业出版社李绪成EntitypublicclassEmployeeimplementsSerializableManyToMany(cascade=CascadeType.PERSIST,CascadeType.MERGE,mappedBy=employeestargetEntity=Employer.class)publicCollectiongetEmployers()returnemployers;JavaEE实用教程(第二版)电子工业出版社李绪成29.7把查询的多个值封装成对象v可以在SELECT列表中使用构造器来返回一个或多个Java实例。v如果实体类的名字在SELECTNEW子句中指定,结果实体实例就是new状态。SELECTNEWch29.CustomerDetails(c.id,c.status,o.count)FROMCustomercJOINc.ordersoWHEREo.count100JavaEE实用教程(第二版)电子工业出版社李绪成29.8批量更新和删除v批量更新和批量删除用于单个实体类的实体,也就是说,在FROM或者UPDATE子句中只能指定一个实体抽象模式类型。v例:DELETEFROMCustomercWHEREc.status=inactiveJavaEE实用教程(第二版)电子工业出版社李绪成29.9使用存储过程v使用存储过程能够提高效率,例:Stringsup_name=“TortugaTrading”;BigDecimalsum=(BigDecimal)em.createNativeQuery(SELECTsum_total(?1)FROMDUAL).setParameter(1,sup_name).getSingleResult();out.println(“订单总额为:+sum+);v存储过程,参考教材。JavaEE实用教程(第二版)电子工业出版社李绪成29.10实体生命周期回调方法v生命周期方法可以定义在:实体类;超类;实体类所关联的实体监听器类;超类所关联的实体监听器类;v实体监听器类必须有一个无参数的构造方法。JavaEE实用教程(第二版)电子工业出版社李绪成29.10.1生命周期回调方法的定义v定义在实体类或者超类的回调方法的格式:void()v定义在实体监听器类的回调方法:void(Objecto)v回调方法可以是任何访问控制类型,但是不能使用static和final修饰。JavaEE实用教程(第二版)电子工业出版社李绪成29.10.2声明生命周期回调方法v使用的元注释及含义如下:PrePersist,持久化之前产生该事件PostPersist,持久化之候产生该事件PreRemove,删除之前产生该事件PostRemove,删除之后产生该事件PreUpdate,更新之前产生该事件PostUpdate,更新之后产生该事件PostLoad,加载之后产生该事件JavaEE实用教程(第二版)电子工业出版社李绪成29.10.3实例PostLoadpublicvoidpostLoad()System.out.println(PreLoad生命周期方法被调用!);JavaEE实用教程(第二版)电子工业出版社李绪成29.10.4生命周期事件的回调方法v如果定义了同一个生命周期事件的多个回调方法,则调用这些方法的顺序为:如果有默认的监听器类,先调用默认的监听器类;如果有实体监听器类,则先调用父层次的实体监听器类,后调用子层次的实体监听器类,如果在同一个实体类上定义了多个实体监听器类,按照定义的顺序执行;如果父层次定义了生命周期回调方法,调用父层次的生命周期回调方法;调用子层次的生命周期回调方法。JavaEE实用教程(第二版)电子工业出版社李绪成JavaEE实用教程(第二版)电子工业出版社李绪成小结v29.1主键生成策略v29.2复合主键v29.3嵌入式主键v29.4一对一关系的配置和使用v29.5多对一和一对多关系的配置和使用v29.6多对多的关系v29.7把查询的多个值封装成对象v29.8批量更新和删除v29.9使用存储过程v29.10实体生命周期回调方法写在最后写在最后成功的基成功的基础在于好的学在于好的学习习惯The foundation of success lies in good habits46谢谢大家荣幸这一路,与你同行ItS An Honor To Walk With You All The Way讲师:XXXXXX XX年XX月XX日
展开阅读全文
相关资源
相关搜索

最新文档


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


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

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


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