Spring Data常用类介绍系列一

JpaEntityInformation

介绍:JpaEntityInformation是Spring Data JPA提供的一个接口,用于提供有关JPA实体类的元数据信息。它包含了对实体类的主键类型、实体类类型以及实体类的属性等信息,可以用于在运行时动态地获取和操作实体类的元数据。

JpaEntityInformation接口定义了常用的几个方法:

  1. getJavaType(): 返回实体类的Class对象,即实体类的类型。

  2. getIdType(): 返回实体类的主键类型,例如Long、Integer等。

  3. getIdAttribute(): 返回表示实体类主键的属性,通常是一个Attribute对象,可以获取属性的名称、类型等信息。

  4. getIdentifier(entity): 返回实体类对象的主键值,需要传入实体对象作为参数。

  5. hasCompositeId(): 判断实体类是否具有复合主键。

  6. isNew(entity): 判断实体对象是否为新对象,即尚未在数据库中持久化。

    public boolean isNew(T entity) {
            //获取实体对象的主键值
            ID id = this.getId(entity);
            //获取实体对象的主键类型
            Class<ID> idType = this.getIdType();
            //根据主键类型进行判断
            //如果逐渐类型不是原始类型(非基本类型),既不是基本类型的包装类,返回主键是否为null来判判断实体对象是否是新对象
            if (!idType.isPrimitive()) {
                return id == null;
                //如果主键类型是数字类型,通过将主键类型转换成long类型,并判断是否等于0来判断实体对象是否为新对象
            } else if (id instanceof Number) {
                //如果主键类型是其他原始类型,抛出异常,表示不支持改类型的主键
                return ((Number)id).longValue() == 0L;
            } else {
                throw new IllegalArgumentException(String.format("Unsupported primitive id type %s", idType));
            }
        }

 通过使用JpaEntityInformation接口,可以在运行时动态地获取实体类的元数据信息,例如实体类的类型、主键类型、主键属性等。这在编写通用的数据访问层代码时非常有用,可以避免在每个具体的Repository中重复编写相同的元数据访问代码。

PersistentEntity

PersistentEntity是Spring Data提供的一个接口,用于表示持久化实体的元数据信息。它是Spring Data提供的通用数据访问层(Repository)的核心组件之一。

PersistentEntity接口定义了访问和操作实体类的元数据的方法。它包含了对实体类的名称、类型、属性、关联关系等信息的定义。通过PersistentEntity,可以在运行时获取实体类的元数据,以便在数据访问层中进行各种操作和查询。

PersistentEntity接口定义了以下常用方法:

  1. getType(): 返回实体类的Class对象,即实体类的类型。

  2. getName(): 返回实体类的名称。

  3. isIdProperty(property): 判断给定的属性是否为实体类的主键属性。

  4. isVersionProperty(property): 判断给定的属性是否为实体类的版本属性(乐观锁)。

  5. getProperty(name): 根据属性名称返回实体类的指定属性。

  6. getPersistentProperty(name): 根据属性名称返回实体类的指定持久化属性,可以获取属性的类型、注解等信息。

  7. getPersistentProperties(): 返回实体类的所有持久化属性的集合。

  8. getIdProperty(): 返回实体类的主键属性,通常是一个PersistentProperty对象,可以获取属性的名称、类型等信息。

  9. getVersionProperty(): 返回实体类的版本属性(乐观锁属性),通常是一个PersistentProperty对象。

  10. getAssociations(): 返回实体类的关联关系(如@ManyToOne、@OneToMany)的集合。

通过使用PersistentEntity接口,可以在运行时动态地获取实体类的元数据信息,例如实体类的类型、名称、主键属性、关联关系等。这在编写通用的数据访问层代码时非常有用,可以根据实体类的元数据进行各种操作和查询,而无需硬编码实体类的具体信息。

Spring Data内部使用PersistentEntity接口来管理实体类的元数据信息,例如在执行查询时根据实体类的属性生成相应的SQL语句。同时,你也可以通过实现该接口来扩展或自定义实体类的元数据操作,以满足特定的需求。

EntityManager

EntityManager是Java Persistence API (JPA) 的一部分,用于与数据库进行交互和管理持久化对象。它是JPA的核心接口之一,用于执行数据库操作,如保存、更新、删除和查询实体对象。

通过EntityManager,可以执行以下常见的数据库操作: 

  1. 保存实体对象:使用persist()方法将新创建的实体对象保存到数据库中。

       通过执行以下几个过程来奖实体对象持久到数据库:

       

    1.首先,该代码会假设你已经通过配置正确的JPA实现并获取一个有效的‘EntityManager’实例(通过通过‘EntityManagerFactory’创建)。

    2.当执行em.persist(entity)时,jpa提供者会将实体对象添加到持久化上下文(PersistenceContext)中。持久化上下文是JPA提供的一种缓存机制,用户跟踪实体对象的变化并将其与数据库同步。

    3.如果实体对象已经存在于持久化上下文中(例如,通过查询获取到的对象),那么persist操作不会执行任何数据库操作,因为实体对象已经处于被托管(managed)状态。

    4.如果实体对象是一个全新的对象,而不是从数据库查询获取到的对象,那么在调用persist后,JPA会执行以下操作: 验证实体对象的映射配置和注解,确保它与数据库表的结构对应。 在当前事务范围内,将实体对象插入到数据库表中,生成相应的INSERT语句。 更新实体对象的标识属性(如果标识属性是由数据库生成的)。 将实体对象的状态标记为被托管(managed)。

    5.在persist操作后,持久化上下文会跟踪实体对象的任何更改。这意味着,如果你在事务提交前或持久化上下文刷新之前修改了实体对象的属性,那么这些更改也会被同步到数据库。

    需要注意的是,在执行persist之前,你必须确保已经开启了一个有效的事务(通过调用EntityManager的beginTransaction方法),否则persist操作会抛出异常。 总结:em.persist(entity)操作会将实体对象添加到持久化上下文中,并在事务提交或刷新时将其持久化到数据库。

  2. 更新实体对象:使用merge()方法更新已存在的实体对象。

    主要执行方法

     

    private Object fireMerge(MergeEvent event) {
            try {
                //确保事务同步方法是否有效
                this.checkTransactionSynchStatus();
                //用户检查在执行何婷操作之前是否存在未解决的问题
                this.checkNoUnresolvedActionsBeforeOperation();
                //触发灭个监听器的合并事件
                this.fastSessionServices.eventListenerGroup_MERGE.fireEventOnEachListener(event, MergeEventListener::onMerge);
                //检查在执行合并操作之后是否存在未解决的问题
                this.checkNoUnresolvedActionsAfterOperation();
            } catch (ObjectDeletedException var3) {
                throw this.getExceptionConverter().convert(new IllegalArgumentException(var3));
            } catch (MappingException var4) {
                throw this.getExceptionConverter().convert(new IllegalArgumentException(var4.getMessage(), var4));
            } catch (RuntimeException var5) {
                throw this.getExceptionConverter().convert(var5);
            }
    
            return event.getResult();
        }

  3. 删除实体对象:使用remove()方法删除数据库中的实体对象。

  4. 查询实体对象:使用createQuery()createNamedQuery()方法创建查询对象,并使用查询语言(如JPQL)执行数据库查询。

  5. 事务管理:通过begin()commit()方法开始和提交事务,或者使用注解(如@Transactional)来进行声明式事务管理。

  6. 刷新缓存:使用flush()方法将尚未保存到数据库的实体对象同步到数据库。

  7. 获取实体对象:使用find()方法根据主键获取实体对象,或使用getReference()方法获取实体对象的引用。

  8. 批量操作:使用persist()merge()remove()等方法执行批量操作,提高效率。

除了上述常见操作,EntityManager还提供了其他一些方法来管理实体对象的生命周期、处理事务、执行原生SQL查询等。

要使用EntityManager,需要通过JPA的实现提供者(如Hibernate、EclipseLink)创建一个EntityManager实例。可以通过依赖注入(如@PersistenceContext注解)或者使用EntityManagerFactory创建一个EntityManager对象。

总之,EntityManager是JPA提供的核心接口之一,用于与数据库交互和管理实体对象的持久化操作。它提供了丰富的方法来执行数据库操作、处理事务、执行查询等。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Data JPA 是一个基于 JPA 规范的 Spring 框架的模块,可以简化 JPA 的开发,提供了一些常用的 CRUD 操作。使用 Spring Data JPA,可以通过编写接口的方式来实现数据访问,而无需编写实现类。具体使用方法可以参考 Spring Data JPA 的官方文档。 ### 回答2: Spring Data JPA是Spring框架中对于Java持久层的集成解决方案,它简化了数据库的访问操作,提供了一系列的接口和方法,使开发者能够更加便捷地进行数据持久化操作。 使用Spring Data JPA的步骤如下: 1. 添加依赖:在项目的pom.xml文件中添加Spring Data JPA的依赖,例如: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 2. 配置数据源:在Spring Boot项目的配置文件中,配置数据库相关的信息,如数据库的URL、用户名、密码等。 3. 创建实体类:使用JPA的注解在Java类中定义实体类,指定表名、字段名、关联关系等信息。 4. 创建Repository接口:创建一个接口,继承自JpaRepository或其他Spring Data提供的Repository接口。该接口将自动根据方法名生成SQL语句,并执行相应的数据库操作。 5. 编写业务逻辑:在Service层中编写业务逻辑,调用Repository接口中的方法进行数据持久化操作。 6. 使用事务管理:在需要执行多个数据库操作的方法上,使用@Transactional注解进行事务管理,确保数据的一致性和完整性。 通过以上步骤,就可以使用Spring Data JPA进行数据库的访问操作了。开发者可以通过调用Repository接口中的方法,如save、findById、findAll等,进行增删改查等操作。Spring Data JPA会自动根据方法名生成相应的SQL语句,并执行数据库操作。 总之,Spring Data JPA的使用简化了数据访问的流程,提高了开发效率,并且提供了较好的扩展性和灵活性,可以满足大部分的数据库访问需求。 ### 回答3: Spring Data JPA 是一个用于简化数据访问层开发的框架,它可以帮助我们更方便地使用 JPA(Java Persistence API)进行数据库操作。下面是使用 Spring Data JPA 的基本步骤: 1. 添加依赖:在项目的 pom.xml 文件中添加 Spring Data JPA 的依赖。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 2. 配置数据源:在配置文件中配置数据库连接的相关信息,如数据库地址、用户名、密码等。 3. 创建实体类:通过使用 JPA 的注解在实体类上定义表名、字段名等信息,并添加相应的 getter 和 setter 方法。 4. 创建 Repository 接口:创建一个继承自 JpaRepository 的接口,用于对实体类进行 CRUD 操作。不需要实现任何方法,Spring Data JPA 将会在运行时根据方法名自动生成查询语句。 5. 使用 Repository:在业务类中注入 Repository 接口的实例,并调用其方法进行数据库操作。例如,可以使用 save() 方法保存实体对象、使用 findById() 方法根据 ID 查询实体对象等。 除了简化了一些常见的数据库操作之外,Spring Data JPA 还提供了很多有用的特性,如分页查询、排序、自定义查询等。可以通过在 Repository 中定义方法名的方式来实现这些功能。 总的来说,使用 Spring Data JPA 可以大大简化数据库操作的代码量,提高开发效率,并且还可以方便地切换不同的持久化框架。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值