JpaEntityInformation
介绍:JpaEntityInformation是Spring Data JPA提供的一个接口,用于提供有关JPA实体类的元数据信息。它包含了对实体类的主键类型、实体类类型以及实体类的属性等信息,可以用于在运行时动态地获取和操作实体类的元数据。
JpaEntityInformation接口定义了常用的几个方法:
-
getJavaType()
: 返回实体类的Class对象,即实体类的类型。 -
getIdType()
: 返回实体类的主键类型,例如Long、Integer等。 -
getIdAttribute()
: 返回表示实体类主键的属性,通常是一个Attribute对象,可以获取属性的名称、类型等信息。 -
getIdentifier(entity)
: 返回实体类对象的主键值,需要传入实体对象作为参数。 -
hasCompositeId()
: 判断实体类是否具有复合主键。 -
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接口定义了以下常用方法:
-
getType()
: 返回实体类的Class对象,即实体类的类型。 -
getName()
: 返回实体类的名称。 -
isIdProperty(property)
: 判断给定的属性是否为实体类的主键属性。 -
isVersionProperty(property)
: 判断给定的属性是否为实体类的版本属性(乐观锁)。 -
getProperty(name)
: 根据属性名称返回实体类的指定属性。 -
getPersistentProperty(name)
: 根据属性名称返回实体类的指定持久化属性,可以获取属性的类型、注解等信息。 -
getPersistentProperties()
: 返回实体类的所有持久化属性的集合。 -
getIdProperty()
: 返回实体类的主键属性,通常是一个PersistentProperty对象,可以获取属性的名称、类型等信息。 -
getVersionProperty()
: 返回实体类的版本属性(乐观锁属性),通常是一个PersistentProperty对象。 -
getAssociations()
: 返回实体类的关联关系(如@ManyToOne、@OneToMany)的集合。
通过使用PersistentEntity接口,可以在运行时动态地获取实体类的元数据信息,例如实体类的类型、名称、主键属性、关联关系等。这在编写通用的数据访问层代码时非常有用,可以根据实体类的元数据进行各种操作和查询,而无需硬编码实体类的具体信息。
Spring Data内部使用PersistentEntity接口来管理实体类的元数据信息,例如在执行查询时根据实体类的属性生成相应的SQL语句。同时,你也可以通过实现该接口来扩展或自定义实体类的元数据操作,以满足特定的需求。
EntityManager
EntityManager
是Java Persistence API (JPA) 的一部分,用于与数据库进行交互和管理持久化对象。它是JPA的核心接口之一,用于执行数据库操作,如保存、更新、删除和查询实体对象。
通过EntityManager
,可以执行以下常见的数据库操作:
-
保存实体对象:使用
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)操作会将实体对象添加到持久化上下文中,并在事务提交或刷新时将其持久化到数据库。
-
更新实体对象:使用
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(); }
-
删除实体对象:使用
remove()
方法删除数据库中的实体对象。 -
查询实体对象:使用
createQuery()
或createNamedQuery()
方法创建查询对象,并使用查询语言(如JPQL)执行数据库查询。 -
事务管理:通过
begin()
和commit()
方法开始和提交事务,或者使用注解(如@Transactional
)来进行声明式事务管理。 -
刷新缓存:使用
flush()
方法将尚未保存到数据库的实体对象同步到数据库。 -
获取实体对象:使用
find()
方法根据主键获取实体对象,或使用getReference()
方法获取实体对象的引用。 -
批量操作:使用
persist()
、merge()
和remove()
等方法执行批量操作,提高效率。
除了上述常见操作,EntityManager
还提供了其他一些方法来管理实体对象的生命周期、处理事务、执行原生SQL查询等。
要使用EntityManager
,需要通过JPA的实现提供者(如Hibernate、EclipseLink)创建一个EntityManager
实例。可以通过依赖注入(如@PersistenceContext
注解)或者使用EntityManagerFactory
创建一个EntityManager
对象。
总之,EntityManager
是JPA提供的核心接口之一,用于与数据库交互和管理实体对象的持久化操作。它提供了丰富的方法来执行数据库操作、处理事务、执行查询等。