知识大全 Spring Data JPA初使用
Posted 知
篇首语:生气是拿别人做错的事来惩罚自己。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Spring Data JPA初使用相关的知识,希望对你有一定的参考价值。
Spring Data JPA初使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
我们都知道Spring是一个非常优秀的JavaEE整合框架 它尽可能的减少我们开发的工作量和难度 在持久层的业务逻辑方面 Spring开源组织又给我们带来了同样优秀的Spring Data JPA 通常我们写持久层 都是先写一个接口 再写接口对应的实现类 在实现类中进行持久层的业务逻辑处理 而现在 Spring Data JPA帮助我们自动完成了持久层的业务逻辑处理 我们要做的 仅仅是声明一个持久层接口 下载开发所需要的发布包 )spring framework RELEASE with docs zip 下载地址 framework )hibernate release Final zip 下载地址 )Spring Data JPA Spring Data JPA 下载地址 data/jpa Spring Data Commons 下载地址 data/mons )其他一些依赖包可以从 上查找下载 新建一个Web项目 spring data jpa 把相应的jar包放到/WebRoot/WEB INF/lib目录下 我也没有挑选哪些是不需要的 最后用到的jar如下 antlr jar sf cglib jar aopalliance jarmons logging jar aspectj weaver RELEASE jarmons lang jardom j jarhibernate mons annotations Final jarhibernate core Final jarhibernate entitymanager Final jarhibernate jpa api Final jarjavassist GA jarjboss logging GA jarjboss transaction api_ _spec Final jarlog j jarmysql connector java bin jar springframework aop RELEASE jar springframework asm RELEASE jar springframework aspects RELEASE jar springframework beans RELEASE jarntext RELEASE jarntext support RELEASE jarre RELEASE jar springframework expression RELEASE jar springframework instrument RELEASE jar springframework instrument tomcat RELEASE jar springframework jdbc RELEASE jar springframework jms RELEASE jar springframework js resources RELEASE jar springframework orm RELEASE jar springframework oxm RELEASE jar springframework test RELEASE jar springframework transaction RELEASE jar springframework web RELEASE jar springframework web portlet RELEASE jar springframework web servlet RELEASE jarslf j api jarslf j log j jarspring data mons core M jarspring data jpa RELEASE jar 在MySql数据库中建立一个叫spring_data_jpa的数据库 create database spring_data_jpa default character set utf ;
JPA配置文件persistence xml )在src目录下建立一个叫META INF的文件夹 )在META INF文件夹下建立persistence xml文件 persistence xml内容如下 xml version= encoding= UTF ?><persistence version= xmlns= xmlns:xsi= instance xsi:schemaLocation= _ _ xsd > <persistence unit name= myJPA transaction type= RESOURCE_LOCAL > <provider> hibernate ejb HibernatePersistenceprovider> <properties> <property name= hibernate dialect value= hibernate dialect MySQL Dialect /> <property name= nnection driver_class value= mysql jdbc Driver /> <property name= nnection username value= root /> <property name= nnection password value= root /> <property name= nnection url value= jdbc:mysql://localhost: /spring_data_jpa?useUnicode=true&characterEncoding=UTF /> <property name= hibernate max_fetch_depth value= /> <property name= hibernate hbm ddl auto value= update /> <property name= hibernate show_sql value= true /> <property name= hibernate format_sql value= true /> <property name= javax persistence validation mode value= none /> properties> persistence unit> persistence> Spring配置文件applicationContext xml 在src目录下建立applicationContext xml applicationContext xml内容如下 xml version= encoding= UTF ?> <beans xmlns= xmlns:xsi= instance xmlns:context= xmlns:aop= xmlns:tx= xmlns:p= xmlns:cache= xmlns:jpa= xsi:schemaLocation= beans xsd context xsd aop xsd tx xsd cache xsd jpa xsd > <context:annotation config /> <context:ponent scan base package= cn luxh app /> <bean id= entityManagerFactory class= springframework orm jpa LocalContainerEntityManagerFactoryBean > <property name= persistenceUnitName value= myJPA /> bean> <bean id= transactionManager class= springframework orm jpa JpaTransactionManager > <property name= entityManagerFactory ref= entityManagerFactory /> bean> <tx:annotation driven transaction manager= transactionManager /> <jpa:repositories base package= cn luxh app repository /> beans> web xml web xml内容如下 xml version= encoding= UTF ?><web app version= xmlns= xmlns:xsi= instance xsi:schemaLocation= app_ _ xsd > <display name>display name> <context param> <param name>webAppRootKeyparam name> <param value>springdatajpa rootparam value> context param> <context param> <param name>log jConfigLocationparam name> <param value>classpath:log j propertiesparam value> context param> <listener> <listener class> springframework web util Log jConfigListenerlistener class> listener> <filter> <filter name>characterEncodingFilterfilter name> <filter class> springframework web filter CharacterEncodingFilterfilter class> <init param> <param name>encodingparam name> <param value>UTF param value> init param> filter> <filter mapping> <filter name>characterEncodingFilterfilter name> <url pattern>/*url pattern> filter mapping> <context param> <param name>contextConfigLocationparam name> <param value>classpath:applicationContext xmlparam value> context param> <listener> <listener class> sprntext ContextLoaderListenerlistener class> listener> <listener> <listener class> springframework web util IntrospectorCleanupListenerlistener class> listener> <wele file list> <wele file>index jspwele file> wele file list>web app> 日志配置 在src目录下建立log j properties文件 log j properties内容如下 log j rootLogger=INFO CONSOLE FI apache=true # 应用于控制台 log j appender CONSOLE= apache log j ConsoleAppender log j appender Threshold=INFO log j appender CONSOLE Target=System out log j appender CONSOLE layout= apache log j PatternLayout log j appender CONSOLE layout ConversionPattern=[framework] %d %c % r [%t] % p %c %x %m%n #log j appender CONSOLE layout ConversionPattern=[start]%dDATE[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n #应用于文件 log j appender FILE= apache log j DailyRollingFileAppenderlog j appender FILE File=$springdatajpa root/springdatajpa log log j appender FILE Append=true log j appender FILE layout= apache log j PatternLayout log j appender FILE layout ConversionPattern=[framework] %d %c % r [%t] % p %c %x %m%n 所有环境配完毕 开始写一个Spring Data JPA 的增删改查 )建立相应的包 )领域模型实体类User package cn luxh app domain;import javax persistence Entity;import javax persistence GeneratedValue;import javax persistence Id;import javax persistence Table;/** * 用户信息 * @author Luxh * */@Entity@Table(name= t_user )public class User @Id @GeneratedValue private Integer id; //账号 private String account; //姓名 private String name; //密码 private String password; //省略 getter和setter方法 )声明持久层接口UserRepository 让UserRepository接口继承CrudRepository T是领域实体 ID是领域实体的主键类型 CrudRepository实现了相应的增删改查方法 package cn luxh app repository;import springframework data repository CrudRepository;import cn luxh app domain User;/** * 用户持久层接口 * @author Luxh * */public interface UserRepository extends CrudRepository 不再需要持久层接口实现类 )业务层 一般多层架构是控制层调用业务层 业务层再调用持久层 所以这里写个业务层 a 业务层接口 package cn luxh app service;import cn luxh app domain User;/** * 用户业务接口 * @author Luxh * */public interface UserService /** * 保存用户 * @param user */ void saveUser(User user) /** * 根据id查找用户 * @param id * @return */ User findUserById(Integer id) /** * 更新用户 * @param user */ void updateUser(User user) /** * 根据ID删除用户 * @param id */ void deleteUserById(Integer id) b 业务层接口实现类 package cn luxh app service;import springframework beans factory annotation Autowired;import springframework stereotype Service;import springframework transaction annotation Transactional;import cn luxh app domain User;import cn luxh app repository UserRepository;/** * 用户业务服务实现类 * @author Luxh * */@Service( userService )public class UserServiceImpl implements UserService @Autowired private UserRepository userRepository;//注入UserRepository @Override @Transactional public void saveUser(User user) userRepository save(user) @Override @Transactional(readOnly=true) public User findUserById(Integer id) return userRepository findOne(id) @Override @Transactional public void updateUser(User user) userRepository save(user) @Override @Transactional public void deleteUserById(Integer id) userRepository delete(id) )编写测试用例 在执行测试的时候 发现如下错误 Caused by: java lang NoSuchMethodError: javax persistence spi PersistenceUnitInfo getValidationMode()Ljavax/persistence/ValidationMode; at hibernate ejb Enfigure(Ejb Configuration java: ) at hibernate ejb HibernatePersistence createContainerEntityManagerFactory(HibernatePersistence java: ) at springframework orm jpa LocalContainerEntityManagerFactoryBean createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean java: ) at springframework orm jpa AbstractEntityManagerFactoryBean afterPropertiesSet(AbstractEntityManagerFactoryBean java: ) at springframework beans factory support AbstractAutowireCapableBeanFactory invokeInitMethods(AbstractAutowireCapableBeanFactory java: ) at springframework beans factory support AbstractAutowireCapableBeanFactory initializeBean(AbstractAutowireCapableBeanFactory java: ) … more 网上说是新版本的Hibernate跟javaee jar里面的JPA接口冲突了 解决方法 移除MyEclipse自带的Java EE Libraries 自己新建一个user libraries 加入Java EE中的jsf api jar jsf impl jar和jstl jar 再加入Tomcat中自带的 servlet api jar
用servlet api jar替换掉javaee jar就没问题了
测试代码 package cn luxh app test;import junit Assert;import junit Test;import junit runner RunWith;import springframework beans factory annotation Autowired;import sprintext ContextConfiguration;import sprintext junit SpringJUnit ClassRunner;import cn luxh app domain User;import cn luxh app service UserService;@RunWith(SpringJUnit ClassRunner class)@ContextConfiguration( /applicationContext xml ) public class UserTest @Autowired private UserService userService; //保存用户 @Test public void testSaveUser() User user = new User() user setAccount( LiHuai ) user setName( 李坏 ) user setPassword( ) userService saveUser(user) //根据id查找用户 @Test public void testFindUserById() Integer id = ; User user = userService findUserById(id) Assert assertEquals( 李坏 user getName()) //更新用户 @Test public void testUpdateUser() Integer id = ; User user = userService findUserById(id) user setName( 李寻欢 ) userService updateUser(user) //根据id删除用户 @Test public void testDeleteUserById() Integer id = ; userService deleteUserById(id) 使用Spring Data JPA相当的简单 我们只需要定义持久层的接口 不需要编写实现代码 步骤和注意点 )在spring配置文件中添加仓库接口的扫描路径 )编写领域实体 需要按照JPA规范 )编写仓库Repository接口 依靠Spring Data规范定义接口方法 比如按照规范定义一个数据访问接口方法 List findByName(String name) Spring Data JPA 就会自动转化为 select u from User u where u name = ? 可以使用的仓库接口有 Repository: 是 Spring Data的一个核心接口 它不提供任何方法 开发者需要在自己定义的接口中声明需要的方法 CrudRepository: 继承Repository 提供增删改查方法 可以直接调用 PagingAndSortingRepository: 继承CrudRepository 具有分页查询和排序功能 JpaRepository: 继承PagingAndSortingRepository 针对JPA技术提供的接口 JpaSpecificationExecutor: 可以执行原生SQL查询 cha138/Article/program/Java/hx/201311/26344相关参考
Spring+JPA+MySQL的配置文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一直在
EJB之JPA(EntityManager) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nbs
使用Eclipse开发JPA快速入门 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Eclips
EJB之JPA(事务回滚) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &
知识大全 学习JPA——Hibernate Annotation使用实例
学习JPA——HibernateAnnotation使用实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
MyEclipse6.0发布整合JPA框架 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Gen
知识大全 Eclipse整合JPA + Struts 2 +&nbs
Eclipse整合JPA+Struts2+&nbs 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 Hibernate(jpa)复合主键annotation声明方法
Hibernate(jpa)复合主键annotation声明方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起
JPA和hibernate对删除操作的不同[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
JPA和hibernate对删除操作的不同[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!