Spring与Jpa整合.docx

上传人:b****5 文档编号:4397382 上传时间:2022-12-01 格式:DOCX 页数:41 大小:114.79KB
下载 相关 举报
Spring与Jpa整合.docx_第1页
第1页 / 共41页
Spring与Jpa整合.docx_第2页
第2页 / 共41页
Spring与Jpa整合.docx_第3页
第3页 / 共41页
Spring与Jpa整合.docx_第4页
第4页 / 共41页
Spring与Jpa整合.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

Spring与Jpa整合.docx

《Spring与Jpa整合.docx》由会员分享,可在线阅读,更多相关《Spring与Jpa整合.docx(41页珍藏版)》请在冰豆网上搜索。

Spring与Jpa整合.docx

Spring与Jpa整合

Spring与Jpa的整合使用

概述

本文主要基于Oracle的Scott用户下的表作为测试数据库。

如果你尚未安装Oracle,也可以根据如下的表信息,在相应的数据库产品中进行创建。

表结构

主要的表,以EMP和DEPT为主

DEPT表结构

EMP表结构

BONUS表结构

SALGRADE表结构

环境准备

Maven设置

在创建项目之前,可以对Maven进行一些必要的设置。

如下,

点击Browse浏览,设置setting.xml。

在setting.xml中可以设置相应的Repository。

如下

创建Maven项目

然后,就可以创建一个新的Maven项目,并在pom.xml中添加依赖。

所依赖的jar包可以通过查找。

为了及时的获得spring或者hibernate的jar包。

我们可能还需要在setting.xml文件中添加如下几个

以下是Spring的MavenRepository:

Forfullreleases:

io.spring.repo.maven.release

http:

//repo.spring.io/release/

false

Formilestones:

io.spring.repo.maven.milestone

http:

//repo.spring.io/milestone/

false

Andforsnapshots:

io.spring.repo.maven.snapshot

http:

//repo.spring.io/snapshot/

true

以下是Jboss的MavenRepository

Forfullreleases:

org.jboss.repo.maven.release

https:

//repository.jboss.org/nexus/content/repositories/release

false

Andforsnapshots:

org.jboss.repo.maven.snapshot

https:

//repository.jboss.org/nexus/content/repositories/snapshot/

true

接下来,引用相应的依赖,首先是spring。

关于这一点,可以参考spring的参考手册。

http:

//docs.spring.io/spring/docs/4.1.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#overview-maven-dependency-management。

关于Hibernate的包引用,参考http:

//hibernate.org/orm/documentation/getting-started/。

其它依赖根据需要,逐一添加。

以下提供Spring及Hibernate基本依赖:

org.springframework

spring-context

4.0.5.RELEASE

commons-logging

commons-logging

org.springframework

spring-context-support

4.0.5.RELEASE

org.springframework

spring-orm

4.0.5.RELEASE

org.springframework

spring-jdbc

4.0.5.RELEASE

org.springframework

spring-beans

4.0.5.RELEASE

org.springframework

spring-aop

4.0.5.RELEASE

org.springframework

spring-webmvc

4.0.5.RELEASE

org.springframework

spring-web

4.0.5.RELEASE

org.springframework

spring-tx

4.0.5.RELEASE

org.springframework

spring-test

4.0.5.RELEASE

org.springframework

spring-expression

4.0.5.RELEASE

org.springframework.data

spring-data-jpa

1.6.0.RELEASE

org.slf4j

jcl-over-slf4j

1.5.8

org.slf4j

slf4j-api

1.5.8

org.slf4j

slf4j-log4j12

1.5.8

log4j

log4j

1.2.14

org.aspectj

aspectjweaver

1.8.0

--hiberanteentitymanager-->

org.hibernate

hibernate-entitymanager

4.3.5.Final

javax.servlet

javax.servlet-api

3.0.1

构建实体

EMP

@Entity

@Table(name="EMP")

publicclassEmployeeimplementsSerializable{

privatestaticfinallongserialVersionUID=1L;

/**雇员编号**/

@Id

@Column(name="EMPNO")

privateIntegerno;

/**雇员姓名**/

@Column(name="ENAME",length=10)

privateStringname;

/**职位**/

@Column(name="JOB",length=9)

privateStringjob;

/**经理**/

@ManyToOne

@JoinColumn(name="MGR")

privateEmployeemanager;

/**员工**/

@OneToMany(mappedBy="no")

@OrderBy("noASC")

privateListemployees;

/**雇佣日期**/

@Column(name="HIREDATE")

privateDatehireDate;

/**工资**/

@Column(name="SAL",precision=7,scale=2)

privateBigDecimalsalary;

/**佣金**/

@Column(name="COMM",precision=7,scale=2)

privateBigDecimalcommission;

/**部门**/

@ManyToOne

@JoinColumn(name="DEPTNO")

privateDepartmentdepartment;

}

DEPT

publicclassDepartmentimplementsSerializable{

privatestaticfinallongserialVersionUID=1L;

/**部门编号**/

@Id

@Column(name="DEPTNO")

privateIntegerno;

/**部门名称**/

@Column(name="DNAME",length=14)

privateStringname;

/**地址**/

@Column(name="LOC",length=13)

privateStringlocation;

publicIntegergetNo(){

returnno;

}

publicvoidsetNo(Integerno){

this.no=no;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicStringgetLocation(){

returnlocation;

}

publicvoidsetLocation(Stringlocation){

this.location=location;

}

}

Jpa实体的注解,需要注意以下几点:

1、必须要有一个无参的构造函数,如果你需要多个构造函数,那么这个无参的构造函数需要显示的指定,且它应该是protected或private。

2、枚举类型或者接口不能被指定为实体。

3、如果实体需要继承某个类的私有化持久状态(即拥有父类中标注有诸如@Column的私有化属性),只需要在父类上标注@MappedSuperclass即可。

通常这样做的目的是,将一些表的公共字段部分抽取出来单独在一个类中声明,避免造成重复声明及类过度冗余。

4、如果实体类的主键是一个复合主键,需要将作为复合主键的字段单独放在一个类里面。

将这个复合主键类标注@Embeddable,然后在实体类中引用这个复合主键类并标注@EmbeddedId;或者跟一般的实体一样,在为主键的属性上标注@Id,然后于实体类上标注@IdClass指定复合主键类。

具体如下示例

Embeddable的形式

@Embeddable

publicclassFeeKindPKimplementsSerializable{

privatestaticfinallongserialVersionUID=-5793813579472602179L;

/**还款期数/贷款期限**/

@Column(name="REPAY_PERIOD")

privateIntegerrepayPeriod;

/**合作机构编号**/

@Column(name="MERCHANT_CODE",length=100)

privateStringmerchantCode;

/**利费率**/

@Column(name="FEE_KIND",length=6)

privateStringfeeKind;

}

@Entity

@Table(name="VIEW_FEE_KIND")

publicclassFeeKindimplementsSerializable{

privatestaticfinallongserialVersionUID=1L;

@EmbeddedId

privateFeeKindPKpk;

publicFeeKindPKgetPk(){

returnpk;

}

publicvoidsetPk(FeeKindPKpk){

this.pk=pk;

}

}

IdClass形式:

publicclassLoanFileCheckPKimplementsSerializable{

privatestaticfinallongserialVersionUID=5884791330896732971L;

privateLoanApplyloanApply;

privateIntegerseqNo;

}

@Entity

@Table(name="LOAN_FILE_CHECK")

@IdClass(LoanFileCheckPK.class)

publicclassLoanFileCheckimplementsSerializable{

privatestaticfinallongserialVersionUID=1L;

/**进件编号*/

@Id

@ManyToOne

@JoinColumn(name="APPLICATION_NUMBER",foreignKey=@ForeignKey(name="FK_FILE_CHECK_APPNUM"))

privateLoanApplyloanApply;

/**序號*/

@Id

@Column(name="SEQ_NO",columnDefinition="NUMBER(6,0)")

privateIntegerseqNo;

}

需要注意的是,以下规则适用于复合主键类:

1、类的访问修饰符必须是public,必须有一个无参的公有的构造方法。

2、复合主键类必须被序列化,也就是实现Serializable接口。

3、重写hashCode和equals方法。

4、如果用IdClass的形式,主键类中的属性名称和类型必须和实体类中的属性名称和类型相同。

5、另外,如果实体类中在一个集合属性上引用@OneToMany的时候,可以用属性fetch=FetchType.LAZY表示集合是懒加载的,用mappedBy到实体类中的某个属性,表示由实体类的该属性来维护。

标注@OrderBy(“<属性名><排序方式>,...”)来表示实体类下的该集合在加载时候的排序方式,可以有多个,用逗号隔开。

如Employee类所示。

持久层

Repository接口

@Repository

publicinterfaceEmployeeRepositoryextendsJpaRepository{

}

@Repository

publicinterfaceDepartmentRepositoryextendsJpaRepository{

}

1、我们主要使用SpringJpa实现对数据持久化的操作。

使用SpringJpa,只需要在接口中标注@Repository,并声明需要使用到的接口方法,而不用真正的去实现它,因为SpringJpa已经为我们提供了默认的接口实现类(SimpleJpaRepository)。

2、通过@Repository注解表示该接口为数据持久化接口。

并在Spring的配置文件中声明

repositoriesbase-package=””/>(需要引入jpa命名空间)来指定Repository所有的位置,这样它会自动被Spring容器扫描,初始化并管理。

3、一般地,Repository接口继承了JpaRepository

这个接口已经为我们提供了一些基本的常用的操作(增删改查),比如通过主键获取实例findOne,获取所有的实例findAll等。

详细请参考JpaRepository的API。

现在,如果我们需要一个方法,根据指定的日期,查询出在这个日期之前入职的所有员工,那么我们只需要在EmployeeRepository中声明这样的一个方法:

ListfindByHireDateLessThanEqual(DatehireDate);

这样,在查询的时候,SpringJpa就会自动为我们构建如下的jpql查询语句:

SelectefromEmployeeewheree.hireDate<=?

1

关于这一点,可以查看SpringJpa的参考手册,http:

//docs.spring.io/spring-data/jpa/docs/1.6.0.RELEASE/reference/html/jpa.repositories.html在这里仅列出方法中可使用的关键字:

Keyword

Sample

JPQLsnippet

And

findByLastnameAndFirstname

…wherex.lastname=?

1andx.firstname=?

2

Or

findByLastnameOrFirstname

…wherex.lastname=?

1orx.firstname=?

2

Is,Equals

findByFirstname,findByFirstnameIs,findByFirstnameEquals

…wherex.firstname=1?

Between

findByStartDateBetween

…wher

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1