Spring与Jpa整合Word文件下载.docx
《Spring与Jpa整合Word文件下载.docx》由会员分享,可在线阅读,更多相关《Spring与Jpa整合Word文件下载.docx(41页珍藏版)》请在冰豆网上搜索。
<
id>
io.spring.repo.maven.release<
/id>
url>
http:
//repo.spring.io/release/<
/url>
snapshots>
enabled>
false<
/enabled>
/snapshots>
/repository>
/repositories>
Formilestones:
io.spring.repo.maven.milestone<
//repo.spring.io/milestone/<
Andforsnapshots:
io.spring.repo.maven.snapshot<
//repo.spring.io/snapshot/<
true<
以下是Jboss的MavenRepository
org.jboss.repo.maven.release<
https:
//repository.jboss.org/nexus/content/repositories/release<
org.jboss.repo.maven.snapshot<
//repository.jboss.org/nexus/content/repositories/snapshot/<
接下来,引用相应的依赖,首先是spring。
关于这一点,可以参考spring的参考手册。
//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基本依赖:
dependency>
<
groupId>
org.springframework<
/groupId>
artifactId>
spring-context<
/artifactId>
version>
4.0.5.RELEASE<
/version>
exclusions>
<
exclusion>
<
commons-logging<
/exclusion>
/exclusions>
<
/dependency>
spring-context-support<
spring-orm<
spring-jdbc<
spring-beans<
spring-aop<
spring-webmvc<
spring-web<
spring-tx<
spring-test<
spring-expression<
org.springframework.data<
spring-data-jpa<
1.6.0.RELEASE<
org.slf4j<
jcl-over-slf4j<
1.5.8<
slf4j-api<
slf4j-log4j12<
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;
/**雇员姓名**/
ENAME"
length=10)
privateStringname;
/**职位**/
JOB"
length=9)
privateStringjob;
/**经理**/
@ManyToOne
@JoinColumn(name="
MGR"
privateEmployeemanager;
/**员工**/
@OneToMany(mappedBy="
no"
@OrderBy("
noASC"
privateList<
Employee>
employees;
/**雇佣日期**/
HIREDATE"
privateDatehireDate;
/**工资**/
SAL"
precision=7,scale=2)
privateBigDecimalsalary;
/**佣金**/
COMM"
privateBigDecimalcommission;
/**部门**/
DEPTNO"
privateDepartmentdepartment;
}
DEPT
publicclassDepartmentimplementsSerializable{
/**部门编号**/
/**部门名称**/
DNAME"
length=14)
/**地址**/
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;
/**还款期数/贷款期限**/
REPAY_PERIOD"
privateIntegerrepayPeriod;
/**合作机构编号**/
MERCHANT_CODE"
length=100)
privateStringmerchantCode;
/**利费率**/
FEE_KIND"
length=6)
privateStringfeeKind;
VIEW_FEE_KIND"
publicclassFeeKindimplementsSerializable{
@EmbeddedId
privateFeeKindPKpk;
publicFeeKindPKgetPk(){
returnpk;
publicvoidsetPk(FeeKindPKpk){
this.pk=pk;
IdClass形式:
publicclassLoanFileCheckPKimplementsSerializable{
privatestaticfinallongserialVersionUID=5884791330896732971L;
privateLoanApplyloanApply;
privateIntegerseqNo;
LOAN_FILE_CHECK"
@IdClass(LoanFileCheckPK.class)
publicclassLoanFileCheckimplementsSerializable{
/**进件编号*/
APPLICATION_NUMBER"
foreignKey=@ForeignKey(name="
FK_FILE_CHECK_APPNUM"
))
/**序號*/
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<
Employee,String>
{
publicinterfaceDepartmentRepositoryextendsJpaRepository<
Department,String>
1、我们主要使用SpringJpa实现对数据持久化的操作。
使用SpringJpa,只需要在接口中标注@Repository,并声明需要使用到的接口方法,而不用真正的去实现它,因为SpringJpa已经为我们提供了默认的接口实现类(SimpleJpaRepository)。
2、通过@Repository注解表示该接口为数据持久化接口。
并在Spring的配置文件中声明<
jpa:
repositoriesbase-package=””/>
(需要引入jpa命名空间)来指定Repository所有的位置,这样它会自动被Spring容器扫描,初始化并管理。
3、一般地,Repository接口继承了JpaRepository<
T,ID>
这个接口已经为我们提供了一些基本的常用的操作(增删改查),比如通过主键获取实例findOne,获取所有的实例findAll等。
详细请参考JpaRepository的API。
现在,如果我们需要一个方法,根据指定的日期,查询出在这个日期之前入职的所有员工,那么我们只需要在EmployeeRepository中声明这样的一个方法:
List<
findByHireDateLessThanEqual(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
1orx.firstname=?
Is,Equals
findByFirstname,findByFirstnameIs,findByFirstnameEquals
…wherex.firstname=1?
Between
findByStartDateBetween
…wher