Spring ORM(Object-Relational Mapping)
Spring ORM是Spring框架中用于简化JPA(Java Persistence API)、Hibernate、JDO(Java Data Objects)和其他ORM工具与Spring框架集成的模块。它提供了一套同一的API,使得开辟者可以轻松地与各种ORM工具进行集成,而不必要直接处理底层的ORM框架细节。下面我将详细先容Spring ORM的关键概念和工作机制。
作用
Spring ORM模块的重要作用是简化和规范数据访问层的开辟。它通过提供模板类和DAO(Data Access Object)支持,使得开辟者可以专注于业务逻辑的实现,而不必关注数据访问层的复杂性。Spring ORM模块不仅支持尺度的JPA,还支持流行的ORM框架如Hibernate和JDO。
焦点组件
- LocalSessionFactoryBean: 这是一个用于配置Hibernate的工厂bean,它创建一个SessionFactory,SessionFactory是Hibernate中的焦点接口,负责提供数据库的会话对象(Session)。在Spring中,你可以通过XML或Java配置来定义这个bean。
- HibernateTemplate: 它是Spring提供的一个简化Hibernate数据访问的模板类。通过这个类,开辟者可以避免冗长的Hibernate会话管理代码,直接实验CRUD(创建、读取、更新、删除)操作。
- JpaTemplate: 类似于HibernateTemplate,但用于JPA。它简化了JPA EntityManager的利用。
- JpaTransactionManager: 这是一个Spring提供的事务管理器,用于管理JPA的事务。它使得JPA事务管理与Spring的声明式事务管理相联合,简化了事务的配置和利用。
利用步骤
- 配置ORM工具:
起首,你必要配置你选择的ORM工具,如Hibernate或JPA。这通常涉及到配置数据库毗连信息、实体类以及其他相干设置。
- 定义实体类:
ORM工具依靠于实体类来映射数据库表。在Spring ORM中,实体类是平凡的Java类,并利用注解或XML来标记它们与数据库表的关系。
- 配置Spring与ORM的集成:
利用Spring配置文件或Java配置类,将Spring与ORM工具集成。例如,配置LocalSessionFactoryBean(对于Hibernate)或EntityManagerFactory(对于JPA)。
- 利用模板类实验数据操作:
在DAO层,可以利用HibernateTemplate或JpaTemplate类实验数据操作。Spring ORM模板类简化了与数据库的交互,处理了会话的打开和关闭、事务的启动和提交等细节。
- 事务管理:
利用Spring的事务管理器(如JpaTransactionManager)管理事务。通过Spring的声明式事务管理,你可以通过注解或XML配置来指定哪些方法必要事务支持。
事务管理
Spring ORM与Spring的事务管理紧密集成。你可以利用Spring的声明式事务管理,通过在服务层方法上利用@Transactional注解来声明事务。Spring将会自动处理事务的开启、提交和回滚,确保数据的划一性。
代码演示
展示了如何利用Spring ORM与Hibernate集成
- @Configuration
- @EnableTransactionManagement
- public class HibernateConfig {
- @Bean
- public DataSource dataSource() {
- DriverManagerDataSource dataSource = new DriverManagerDataSource();
- dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
- dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
- dataSource.setUsername("username");
- dataSource.setPassword("password");
- return dataSource;
- }
- @Bean
- public LocalSessionFactoryBean sessionFactory() {
- LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
- sessionFactory.setDataSource(dataSource());
- sessionFactory.setPackagesToScan("com.example.entity");
- sessionFactory.setHibernateProperties(hibernateProperties());
- return sessionFactory;
- }
- @Bean
- public HibernateTransactionManager transactionManager() {
- HibernateTransactionManager transactionManager = new HibernateTransactionManager();
- transactionManager.setSessionFactory(sessionFactory().getObject());
- return transactionManager;
- }
- private Properties hibernateProperties() {
- Properties properties = new Properties();
- properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
- properties.put("hibernate.show_sql", "true");
- return properties;
- }
- }
复制代码 在这个配置类中,我们配置了数据源、Hibernate的SessionFactory以及Spring的事务管理器。通过这种方式,我们可以在Spring的服务层轻松地利用Hibernate进行数据库操作,并利用Spring的声明式事务管理确保数据划一性。
长处
- 简化数据访问层的开辟: Spring ORM提供了划一的API,简化了数据访问层的开辟。
- 集成了事务管理: Spring ORM与Spring的事务管理无缝集成,支持声明式事务。
- 支持多种ORM框架: Spring ORM不仅支持JPA,还支持Hibernate、JDO等多种ORM工具。
挑战
- 学习曲线: 对于我们初学者来说,明白Spring ORM与各种ORM工具的集成和配置可能必要一些时间。
- 与ORM框架的依靠: 尽管Spring ORM简化了ORM框架的利用,但在利用详细的ORM框架时,开辟者仍必要熟悉该框架的工作原理和配置。
总结
Spring ORM通过简化ORM工具与Spring框架的集成,帮助开辟者专注于业务逻辑的实现,同时提供了强盛的事务管理和同一的数据访问API。
Spring Transaction(Spring事务管理)
该模块是Spring框架的焦点模块之一,它提供了一种强盛而灵活的事务管理机制,可以在Java应用中处理复杂的事务场景。Spring的事务管理抽象了底层的事务处理逻辑,支持声明式和编程式的事务管理方式,使开辟者可以专注于业务逻辑,而不用处理繁琐的事务管理细节。
事务的根本概念
事务是一组要么全部实验乐成、要么全部失败的操作单元。在数据库操作中,事务保证数据的划一性、隔离性、长期性和原子性(即ACID属性)。
- 原子性(Atomicity): 事务中的操作要么全部完成,要么全部不完成。
- 划一性(Consistency): 事务开始和竣事时,数据都必须处于划一状态。
- 隔离性(Isolation): 事务的实验过程不会被其他事务干扰。
- 长期性(Durability): 事务一旦提交,结果就会永世保存。
Spring事务管理的类型
- 编程式事务管理: 开辟者在代码中显式管理事务的开始、提交和回滚。这种方式提供了最大的灵活性,但也增加了代码的复杂性。
- 声明式事务管理: 利用注解或XML配置来声明事务的边界,Spring容器会自动管理事务的开始、提交和回滚。声明式事务管理是Spring事务管理中最常用的方式。
声明式事务管理
声明式事务管理是通过@Transactional注解实现的。这个注解可以应用在类或者方法上,用来标记该类或方法必要事务支持。
- @Service
- public class MyService {
- @Transactional
- public void performTransaction() {
- // 业务逻辑代码
- }
- }
复制代码 在上面的示例中,@Transactional注解声明performTransaction()方法在实验时会启动一个事务。如果方法实验过程中抛出一个未捕获的运行时异常(RuntimeException),事务将会自动回滚。如果方法实验乐成,事务将会提交。
事务的流传行为(Propagation)
事务流传行为定义了一个事务方法在调用另一个事务方法时应该如何进行事务管理。Spring支持以下几种流传行为:
- REQUIRED: 默认流传行为,体现当前方法必须在一个事务中运行。如果当前已经存在一个事务,则加入该事务;否则新建一个事务。
- REQUIRES_NEW: 总是新建一个事务。如果当前存在一个事务,则挂起该事务。
- NESTED: 如果当前已经存在事务,则嵌套在该事务中运行;否则新建一个事务。嵌套事务可以独立于外部事务进行回滚。
- MANDATORY: 当前方法必须在一个已有事务中运行,如果没有事务,则抛出异常。
- NOT_SUPPORTED: 当前方法不必要事务。如果当前存在事务,则挂起该事务。
- NEVER: 当前方法不必要事务。如果当前存在事务,则抛出异常。
- SUPPORTS: 如果当前存在事务,则加入该事务;如果不存在事务,则以非事务方式运行。
事务的隔离级别(Isolation)
事务的隔离级别控制了事务之间的可见性。Spring支持以下几种隔离级别:
- DEFAULT: 利用底层数据库的默认隔离级别。
- READ_UNCOMMITTED: 最低的隔离级别,答应读取尚未提交的数据,可能导致脏读。
- READ_COMMITTED: 只答应读取已提交的数据,避免脏读。
- REPEATABLE_READ: 确保在同一个事务中多次读取的数据划一,防止不可重复读。
- SERIALIZABLE: 最高的隔离级别,完全隔离,事务串行实验,防止脏读、不可重复读和幻读。
事务的回滚规则
默认情况下,Spring只在碰到未捕获的运行时异常(RuntimeException)或错误(Error)时才回滚事务。如果希望在捕获的异常或查抄异常(CheckedException)下也回滚,可以通过@Transactional注解的rollbackFor属性来指定。
- @Transactional(rollbackFor = Exception.class)
- public void performTransaction() throws Exception {
- // 业务逻辑代码
- if (someCondition) {
- throw new Exception("触发回滚");
- }
- }
复制代码 编程式事务管理
编程式事务管理利用Spring提供的TransactionTemplate或PlatformTransactionManager来手动管理事务。虽然这种方式提供了更灵活的控制,但一样平常情况下不发起利用,除非有特别的需求。
- @Service
- public class MyService {
- @Autowired
- private PlatformTransactionManager transactionManager;
- public void performTransaction() {
- TransactionTemplate template = new TransactionTemplate(transactionManager);
- template.execute(status -> {
- try {
- // 业务逻辑代码
- } catch (Exception e) {
- status.setRollbackOnly();
- }
- return null;
- });
- }
- }
复制代码 事务管理器
Spring支持多种事务管理器,根据利用的长期化技能选择合适的事务管理器:
- DataSourceTransactionManager: 用于JDBC的事务管理。
- JpaTransactionManager: 用于JPA的事务管理。
- HibernateTransactionManager: 用于Hibernate的事务管理。
- JtaTransactionManager: 用于分布式事务的事务管理。
事务管理的配置
Spring事务管理可以通过XML或Java配置。以下是Java配置的示例:
- @Configuration
- @EnableTransactionManagement
- public class TransactionConfig {
- @Bean
- public DataSourceTransactionManager transactionManager(DataSource dataSource) {
- return new DataSourceTransactionManager(dataSource);
- }
- }
复制代码 @EnableTransactionManagement注解启用了Spring的声明式事务管理。
总结
Spring事务管理通过抽象底层的事务处理逻辑,使开辟者可以专注于业务逻辑而不必处理复杂的事务管理细节。声明式事务管理提供了一种方便且强盛的方式来管理事务,而Spring对事务流传行为、隔离级别和回滚规则的支持,使得它能够应对各种复杂的事务场景。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |