Spring与Jpa整合.docx
- 文档编号:4397382
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:41
- 大小:114.79KB
Spring与Jpa整合.docx
《Spring与Jpa整合.docx》由会员分享,可在线阅读,更多相关《Spring与Jpa整合.docx(41页珍藏版)》请在冰豆网上搜索。
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:
//repo.spring.io/release/
Formilestones:
//repo.spring.io/milestone/
Andforsnapshots:
//repo.spring.io/snapshot/
以下是Jboss的MavenRepository
Forfullreleases:
//repository.jboss.org/nexus/content/repositories/release
Andforsnapshots:
//repository.jboss.org/nexus/content/repositories/snapshot/
接下来,引用相应的依赖,首先是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基本依赖:
--hiberanteentitymanager-->
构建实体
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")
privateList
/**雇佣日期**/
@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中声明这样的一个方法: List 这样,在查询的时候,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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Spring Jpa 整合
![提示](https://static.bdocx.com/images/bang_tan.gif)