spring 事务持久性_项目学生:Spring数据的持久性

spring 事务持久性

这是Project Student的一部分。 其他职位包括带有Jersey的Webservice Client,带有Jersey的 Webservice Server和业务层 。

RESTful webapp onion的最后一层是持久层。

持久层有两种哲学。 一个阵营将数据库视为一个简单的存储,并希望保持这一层非常薄。 另一阵营知道,在数据库中执行任务通常比访问数据库中的数据,用Java完成必要的工作以及可能第二次访问结果要快得多。 该阵营通常需要一个相当厚的持久层。

第二阵营也有一群希望广泛使用存储过程的流放者。 这使数据库功能更加强大,但在持久层中却付出了一些额外的复杂性。 它的主要缺点是存储过程是特定于数据库的。

第二批流亡者仅使用存储过程来提高安全性。 我已经在前面进行了讨论,例如,您应该使用用户名和密码来调用存储过程并获得“接受”或“拒绝”响应,而不是检索哈希密码并在应用程序中进行比较。 第一种方法允许您使用数据库的GRANT和REVOKE特权将哈希密码存储在不可访问的表中,即使攻击者可以以应用程序用户身份执行任意SQL注入。

(旁注:您通常可以用Java编写存储过程!Oracle支持它,PostgreSQL支持它(通过PL / Java扩展),H2支持它(通过类路径)。我不知道MySQL是否支持它。确定的成本,但这可能是解决许多问题的最佳解决方案。)

无论如何,该项目目前仅支持CRUD操作,它们是使用薄型持久层的经典示例。 但是,添加“ thick”方法很容易–只需使用它们创建一个CourseRepositoryImpl类。 (此类不应实现CourseRepository接口!)

设计决策

Spring Data –我们使用Spring Data是因为它会自动生成持久层类。

局限性

分页 –没有尝试支持分页。 由于Spring Data已经支持它,所以这不是一个大问题-我们只需要编写胶水即可。

组态

基本配置仅需要@EnableJpaRepositories批注。

使用纯内存嵌入式数据库进行集成测试需要做更多的工作。 即使使用H2 URL告诉它使数据库服务器关闭,直接使用Spring嵌入式数据库也不起作用。 数据库已正确初始化,但在测试实际运行之前已关闭。 结果是失败,因为缺少数据库架构。

使用由文件支持的内存数据库是微不足道的,但可能导致并发运行问题,意外拉入旧的测试数据等。显而易见的解决方案是使用随机的临时支持文件,但是这种方法会带来自身的问题。 。

下面的方法是将嵌入式数据库缓存在配置类中,并仅在应用程序关闭时销毁它。 这引入了一些非显而易见的行为,迫使我们也必须显式创建一些其他bean。

(IIRC,如果您在配置类中创建嵌入式数据库,并在配置文件中创建事务Bean,则spring在配置文件中创建幻像数据源,并且初始化失败。当我开始在同一文件中创建事务Bean时,此问题消失了放置为数据源。)

@Configuration
@EnableJpaRepositories(basePackages = { "com.invariantproperties.sandbox.student.repository" })
@EnableTransactionManagement
@PropertySource("classpath:test-application.properties")
@ImportResource("classpath:applicationContext-dao.xml")
public class TestPersistenceJpaConfig implements DisposableBean {private static final Logger log = LoggerFactory.getLogger(TestPersistenceJpaConfig.class);private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql";private static final String PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY = "hibernate.ejb.naming_strategy";private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";// private static final String PROPERTY_NAME_PERSISTENCE_UNIT_NAME =// "persistence.unit.name";@Resourceprivate Environment environment;private EmbeddedDatabase db = null;@Beanpublic DataSource dataSource() {final EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();db = builder.setType(EmbeddedDatabaseType.H2).build(); // .script("foo.sql")return db;}@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactory() throws ClassNotFoundException {LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();bean.setDataSource(dataSource());bean.setPackagesToScan(environment.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));bean.setPersistenceProviderClass(HibernatePersistence.class);// bean.setPersistenceUnitName(environment// .getRequiredProperty(PROPERTY_NAME_PERSISTENCE_UNIT_NAME));HibernateJpaVendorAdapter va = new HibernateJpaVendorAdapter();bean.setJpaVendorAdapter(va);Properties jpaProperties = new Properties();jpaProperties.put(PROPERTY_NAME_HIBERNATE_DIALECT,
environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));jpaProperties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL,environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));jpaProperties.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY,environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY));jpaProperties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL,environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));jpaProperties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO,environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO));bean.setJpaProperties(jpaProperties);return bean;}@Beanpublic PlatformTransactionManager transactionManager() {JpaTransactionManager tm = new JpaTransactionManager();try {tm.setEntityManagerFactory(this.entityManagerFactory().getObject());} catch (ClassNotFoundException e) {// TODO: log.}return tm;}@Beanpublic PersistenceExceptionTranslationPostProcessor exceptionTranslation() {return new PersistenceExceptionTranslationPostProcessor();}@Overridepublic void destroy() {if (db != null) {db.shutdown();}}
}

applicationContext.xml文件为空。 该属性文件是:

# hibernate configuration
hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
hibernate.show_sql=false
hibernate.format_sql=true
hibernate.hbm2ddl.auto=create# jpa configuration
entitymanager.packages.to.scan=com.invariantproperties.sandbox.student.domain
persistence.unit.dataSource=java:comp/env/jdbc/ssDS
persistence.unit.name=ssPU

单元测试

由于所有代码都是自动生成的,因此没有单元测试。 这将随着添加自定义方法而改变。

整合测试

现在,我们可以编写业务层的集成测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { BusinessApplicationContext.class, TestBusinessApplicationContext.class,TestPersistenceJpaConfig.class })
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class CourseServiceIntegrationTest {@Resourceprivate CourseService dao;@Testpublic void testCourseLifecycle() throws Exception {final String name = "Calculus 101";final Course expected = new Course();expected.setName(name);assertNull(expected.getId());// create courseCourse actual = dao.createCourse(name);expected.setId(actual.getId());expected.setUuid(actual.getUuid());expected.setCreationDate(actual.getCreationDate());assertThat(expected, equalTo(actual));assertNotNull(actual.getUuid());assertNotNull(actual.getCreationDate());// get course by idactual = dao.findCourseById(expected.getId());assertThat(expected, equalTo(actual));// get course by uuidactual = dao.findCourseByUuid(expected.getUuid());assertThat(expected, equalTo(actual));// update courseexpected.setName("Calculus 102");actual = dao.updateCourse(actual, expected.getName());assertThat(expected, equalTo(actual));// delete Coursedao.deleteCourse(expected.getUuid());try {dao.findCourseByUuid(expected.getUuid());fail("exception expected");} catch (ObjectNotFoundException e) {// expected}}/*** @test findCourseById() with unknown course.*/@Test(expected = ObjectNotFoundException.class)public void testfindCourseByIdWhenCourseIsNotKnown() {final Integer id = 1;dao.findCourseById(id);}/*** @test findCourseByUuid() with unknown Course.*/@Test(expected = ObjectNotFoundException.class)public void testfindCourseByUuidWhenCourseIsNotKnown() {final String uuid = "missing";dao.findCourseByUuid(uuid);}/*** Test updateCourse() with unknown course.* * @throws ObjectNotFoundException*/@Test(expected = ObjectNotFoundException.class)public void testUpdateCourseWhenCourseIsNotFound() {final Course course = new Course();course.setUuid("missing");dao.updateCourse(course, "Calculus 102");}/*** Test deleteCourse() with unknown course.* * @throws ObjectNotFoundException*/@Test(expected = ObjectNotFoundException.class)public void testDeleteCourseWhenCourseIsNotFound() {dao.deleteCourse("missing");}
}

源代码

  • 可从http://code.google.com/p/invariant-properties-blog/source/browse/student/student-business和http://code.google.com/p/invariant-properties-获得源代码。 blog / source / browse / student / student-persistence 。

参考: 项目学生: Invariant Properties博客上来自我们JCG合作伙伴 Bear Giles的Spring数据的持久性 。

翻译自: https://www.javacodegeeks.com/2014/01/project-student-persistence-with-spring-data.html

spring 事务持久性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】广东开放大学 商法 形成性考核 (40)

选择题 题目:2020年1月1日,小李到广州A超市购物,发现A超市设有服务台和自助寄存柜。考虑到服务台需要排队,为节省时间,小李根据A超市对自助寄存柜的使用方法及物品的保管等问题的明确指引和警示,进行操作&a…

力扣算法001_两数之和

1、 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例: 给定 nums [2, 7, 11…

使用Apache Ignite瘦客户端– Apache Ignite内部博客

从2.4.0版本开始,Apache Ignite引入了一种新的连接到Ignite群集的方法,该方法允许与Ignite群集进行通信而无需启动Ignite客户端节点。 从历史上看,Apache Ignite提供了客户端和服务器节点两个概念。 点燃旨在用作轻量级模式的客户端节点&…

【渝粤教育】广东开放大学 岭南文化概论 形成性考核 (45)

选择题 题目: ()是岭南文化中最有响并最具典型性的文化。 选择一项: 答案:看左侧 题目: ()是岭南文化中最有响并最具典型性的文化。 选择一项: 答案:看左侧…

【渝粤教育】广东开放大学 数据采集技术 形成性考核 (29)

选择题 题目:GET和POST的区别,以下说法不正确的有()。 题目:以下属于HTTP协议的主要特点的是()。 题目:增量式爬虫中的()指的是:爬虫以相同的频率…

2020-12-15通信原理

1、随机过程是一类随时间作随机变化的过程,不能用确切的时间函数描述。 不同角度理解:(1)对应不同随机试验结果的时间过程的集合;(2)随机过程是随机变量概念的延伸。 可以把随机过程看作是在时间…

【渝粤教育】广东开放大学 机械制造基础 形成性考核 (51)

选择题 题目:退火一般安排在 ( ) 题目:从蠕墨铸铁的牌号上可以看出其硬度和冲击韧性。 题目:钎焊接头的主要缺点是( ) 题目:高碳钢淬火后回火时,随回火温度升高其( ) 题目&#xff1…

【渝粤教育】广东开放大学 电子支付与安全 形成性考核 (59)

选择题 题目:直接参与者:商行和央行(商行以其不通层次的管辖银行在相应层次的央行开设清算帐户) 答案:看左侧 题目:支付系统全国处理中心是控制支付系统运行,管理国家金融网络通信、接收、结算、…

java 将光标移至行首_Java:将条件移至消息文件

java 将光标移至行首Java类ResourceBundle和MessageFormat提供了一个很好的工具集,用于解决Java应用程序内部的本地化消息。 这篇文章提供了一个小示例,说明如何使用ChoiceFormat将与消息相关的简单条件从Java代码移动到消息文件中。 如果您已经知道Choi…

2020-12-19通信电子线路第一章

振幅键控(Amplitude-shift keying) (ASK) 相位键控(phase-shift keying) (PSK) 频率键控:(Frequency-shift keying) (FSK) CDMA (Code Division Multiple Access) 码分多址 软件无线电结构&am…

【渝粤教育】广东开放大学 网络市场与预测 形成性考核 (23)

选择题 题目:()是利用互联网发掘和了解顾客需求、市场机会、竞争对手、行业潮流、分销渠道以及战略合作伙伴等方面的情况。 题目:市场调查首先要解决的问题是( )。 题目:为了在市场调查方案实施…

在Ubuntu 18.04上实际安装OpenJDK 11

OpenJDK 11于 1018年9月25日发布 。由于这是版本8之后的第一个LTS版本,因此期待已久。 在Ubuntu 18.04(Bionic Beaver)上安装了该软件包后,该软件包附带了一个名为openjdk-11-jdk的软件包,令我惊讶的是它仍然是早期版本…

【渝粤教育】广东开放大学 计量基础知识 形成性考核 (48)

选择题 题目:工业计量也称工程计量。一般指工业、工程、生产企业中的()计量。 答案:看左侧 题目:我国古代有许多令炎黄子孙骄傲自豪的计量文化,我们耳熟能详的就有()等。 答案&#…

Verilog二选一数据选择器

//二选一数据选择器module mux2_1(a0,a1,s,f) input a0,a1,s; output f;//默认是wire(线)变量 assign f(s)?a1:a0;//assign 专门给线类型变量赋值 endmodulemodule mux2_1(a,s,f) input s; input [1:0]a; output f; reg f;//reg(寄存器型) a…

【渝粤教育】电大中专Office办公软件 (1)作业 题库

1.西文字符一般采用的编码是( )。 A.ASCII码 B.BCD码 C.国标码 D.EBCDIC码 正确 正确答案:左边查询 学生答案:A 2.若已知一汉字的国标码是5E38,则其内码是( )。 A.DE38 B.DEB8 C.7E58 D.5EB8 错…

现代交换技术学习笔记001

1、交换 在通信领域中,所谓交换,就是在通信网上,负责在通信的源和目的终端之间建立通信信道传送通信信息的机制(控制)。 2、通信网的组成(三要素) 交换设备,传输设备,终端…

【渝粤教育】电大中专中医基础知识 (3)作业 题库

1.“证”是指 A.疾病的体征与症状 B.对疾病的症状与体征的分析 C.对疾病某一阶段的病理概括 D.对疾病全过程规律的认识 E.对疾病的症状与体征的调查 错误 正确答案:左边查询 学生答案:未作答 2.中医学认识疾病和治疗疾病的基本思路是 A.恒动观念 B.同病异…

【渝粤教育】电大中专会计电算化作业 题库

1.下列有关会计电算化狭义概念的说法正确的是()。 A.以会计理论为主体的电子信息技术在会计工作中的应用 B.与实现电算化有关的所有工作 C.以电子计算机为主体的电子信息技术在会计工作中的应用 D.与实现电算化有关的主要工作 错误 正确答案:左边查询 学生答案&…

移动通信学习笔记_01概述

OSI 7层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP共5层:物理层、数据链路层、网络层、传输层(运输层)、应用层 物理层:编码(信道编码)、调制 本课程&#xff1a…

java 绑定微信号开发_Java开发中的更多常见危险信号

java 绑定微信号开发在《 Java开发中的常见危险信号》一文中,我研究了一些不一定本身就是错误或不正确的做法,但它们可能表明存在更大的问题。 这些“红色标记”类似于“代码气味”的概念,我在这篇文章中引用的某些特定“红色标记”被称为“代…