org.springframework.data.annotation.Transient 和 javax.persistence.Transient 的区别

Posted 143401010116

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了org.springframework.data.annotation.Transient 和 javax.persistence.Transient 的区别相关的知识,希望对你有一定的参考价值。

1、org.springframework.data.annotation.Transient 和 javax.persistence.Transient 都是用于标记一个属性不需要被持久化到数据库中的注解。它们的区别在于它们所处的框架和使用场景。

org.springframework.data.annotation.Transient 是 Spring Data JPA 框架提供的注解,用于标记实体类中某些属性不需要被持久化到数据库中。它通常用于在使用 Spring Data JPA 进行持久化操作时,指示框架忽略实体类中的某些属性。这些属性可能是在运行时计算而来的、或者是一些临时的属性,不需要存储到数据库中。这个注解是非标准注解,只在Spring Data JPA中有效。

javax.persistence.Transient 是 Java Persistence API (JPA) 提供的注解,用于标记实体类中某些属性不需要被持久化到数据库中。它与org.springframework.data.annotation.Transient 功能相似,但是可以在其他 JPA 实现中使用。在使用 JPA 进行持久化操作时,这个注解可以用于指示框架忽略实体类中的某些属性,这些属性同样可能是在运行时计算而来的、或者是一些临时的属性,不需要存储到数据库中。这个注解是标准注解,在所有实现 JPA 规范的框架中都是有效的。

因此,这两个注解的主要区别在于它们所处的框架和使用场景。如果你使用的是 Spring Data JPA,那么应该使用 org.springframework.data.annotation.Transient 注解;如果你使用的是其他 JPA 实现,那么应该使用 javax.persistence.Transient 注解。

 

2、

JPA(Java Persistence API)是一种 Java EE 规范,它提供了一组 API 接口,用于将 Java 对象映射到关系型数据库中。JPA 规范通过注解和 XML 配置文件来定义实体类和关系映射,开发者可以使用 JPA 提供的 API 来进行 CRUD 操作、查询、排序、分页等。

Spring Data JPA 是基于 JPA 规范的数据访问框架,它提供了一种简化 JPA 数据访问层的方式,使得开发者可以更加方便地进行数据持久化操作。Spring Data JPA 提供了一组通用的接口和类,如 JpaRepository、JpaSpecificationExecutor、PagingAndSortingRepository 等,这些接口和类封装了常见的数据访问操作,使得开发者可以更加方便地进行数据访问。

以下是 JPA 和 Spring Data JPA 的主要区别:

  1. JPA 只是一个规范,而 Spring Data JPA 是基于 JPA 规范的数据访问框架,它提供了一种简化 JPA 数据访问层的方式。

  2. JPA 只提供了一组 API 接口,需要开发者自己实现具体的数据访问逻辑,而 Spring Data JPA 提供了一组通用的接口和类,封装了常见的数据访问操作,使得开发者可以更加方便地进行数据访问。

  3. JPA 需要开发者自己配置 EntityManagerFactory 和 EntityManager,而 Spring Data JPA 自动配置 EntityManagerFactory 和 EntityManager,使得开发者可以更加方便地进行数据访问。

  4. JPA 可以与其他框架集成,如 Spring Framework、Hibernate、EclipseLink 等,而 Spring Data JPA 是基于 Spring Framework 和 JPA 规范构建的数据访问框架,通常使用 Hibernate 作为默认的 JPA 实现提供者。

总的来说,JPA 是一种规范,Spring Data JPA 是基于 JPA 规范的数据访问框架,它提供了一种简化 JPA 数据访问层的方式,并封装了常见的数据访问操作,使得开发者可以更加方便地进行数据持久化操作。

org.springframework.data.cassandra.CassandraUncategorizedException

【中文标题】org.springframework.data.cassandra.CassandraUncategorizedException【英文标题】: 【发布时间】:2021-11-05 17:11:58 【问题描述】:

我在 Spring Boot 中使用休眠来调用 Cassandra 3.11 中的方法 findByIdField(UUID id) 以返回一个列表,并且此错误波纹出现在控制台日志中。

我有一个 entityrepositoryservice 使用这个简单的方法。我将 UUID 作为参数传递,并检查数据库中的 ID 并且它存在。

控制器:

Optional<List<Fields>> fieldList = fieldService.findByIdField(UUID.fromString(id));

服务:

public Optional<List<Fields>> findByIdField(UUID id) throws SQLException 
    return repository.findByIdField(id);

存储库:

@AllowFiltering
Optional<List<Fields>> findByIdField(UUID id);

错误:

: 嵌套异常是 java.lang.NullPointerException

在 org.springframework.data.cassandra.core.cql.CassandraExceptionTranslator.translate(CassandraExceptionTranslator.java:160) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.cql.CassandraExceptionTranslator.translateExceptionIfPossible(CassandraExceptionTranslator.java:72) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.config.CqlSessionFactoryBean.translateExceptionIfPossible(CqlSessionFactoryBean.java:646) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.3.3.jar:5.3.3] 在 org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) ~[spring-tx-5.3.3.jar:5.3.3] 在 org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152) ~[spring-tx-5.3.3.jar:5.3.3] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.3.jar:5.3.3] 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.3.jar:5.3.3] 在 com.sun.proxy.$Proxy117.findByIdSensor(未知来源)~[na:na] 在 br.com.genesis.service.operacao.GerarStatusSinalSasMcsScmPiService.findByIdSensor(GerarStatusSinalSasMcsScmPiService.java:44) ~[classes/:2.4.2] 在 br.com.genesis.controller.operacao.OpeStatusComponeteController.mostraHistoricoFalha(OpeStatusComponeteController.java:941) ~[classes/:2.4.2] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_152] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_152] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_152] 在 java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_152] 在 org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.3.jar:5.3.3] 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.3.jar:5.3.3] 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.3.jar:5.3.3] 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.3.jar:5.3.3] 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.3.jar:5.3.3] 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.3.jar:5.3.3] 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.3.jar:5.3.3] 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.3.jar:5.3.3] 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.3.jar:5.3.3] 在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.3.jar:5.3.3] 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[servlet-api.jar:4.0.FR] 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.3.jar:5.3.3] 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[servlet-api.jar:4.0.FR] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:9.0.41] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.41] 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-websocket.jar:9.0.41] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.41] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.41] 在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.3.jar:5.3.3] 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.3.3.jar:5.3.3] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.41] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.41] 在 org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.3.jar:5.3.3] 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.3.3.jar:5.3.3] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.41] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.41] 在 org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:126) [spring-boot-2.4.2.jar:2.4.2] 在 org.springframework.boot.web.servlet.support.ErrorPageFilter.access$000(ErrorPageFilter.java:64) [spring-boot-2.4.2.jar:2.4.2] 在 org.springframework.boot.web.servlet.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:101) [spring-boot-2.4.2.jar:2.4.2] 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.3.3.jar:5.3.3] 在 org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:119) [spring-boot-2.4.2.jar:2.4.2] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.41] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.41] 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) [spring-web-5.3.3.jar:5.3.3] 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.3.3.jar:5.3.3] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.41] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.41] 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) [catalina.jar:9.0.41] 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [catalina.jar:9.0.41] 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) [catalina.jar:9.0.41] 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) [catalina.jar:9.0.41] 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [catalina.jar:9.0.41] 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690) [catalina.jar:9.0.41] 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [catalina.jar:9.0.41] 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [catalina.jar:9.0.41] 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) [tomcat-coyote.jar:9.0.41] 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-coyote.jar:9.0.41] 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) [tomcat-coyote.jar:9.0.41] 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) [tomcat-coyote.jar:9.0.41] 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:9.0.41] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_152] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_152] 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:9.0.41] 在 java.lang.Thread.run(Thread.java:748) [na:1.8.0_152] 引起:java.lang.NullPointerException:null 在 sun.invoke.util.ValueConversions.unboxLong(ValueConversions.java:121) ~[na:1.8.0_152] 在 br.com.genesis.model.entity.operacao.GerarStatusSinalSasMcsScmPi_Accessor_7l4hif.setProperty(Unknown Source) ~[classes/:2.4.2] 在 org.springframework.data.mapping.model.InstantiationAwarePropertyAccessor.setProperty(InstantiationAwarePropertyAccessor.java:104) ~[spring-data-commons-2.4.3.jar:2.4.3] 在 org.springframework.data.mapping.model.ConvertingPropertyAccessor.setProperty(ConvertingPropertyAccessor.java:63) ~[spring-data-commons-2.4.3.jar:2.4.3] 在 org.springframework.data.cassandra.core.convert.MappingCassandraConverter.readProperty(MappingCassandraConverter.java:413) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.convert.MappingCassandraConverter.readProperties(MappingCassandraConverter.java:400) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.convert.MappingCassandraConverter.doReadEntity(MappingCassandraConverter.java:389) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.convert.MappingCassandraConverter.doReadEntity(MappingCassandraConverter.java:365) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.convert.MappingCassandraConverter.readEntityFromRow(MappingCassandraConverter.java:345) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.convert.MappingCassandraConverter.readRow(MappingCassandraConverter.java:341) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.convert.MappingCassandraConverter.read(MappingCassandraConverter.java:298) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.CassandraTemplate.lambda$getMapper$11(CassandraTemplate.java:910) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.CassandraTemplate.lambda$select$0(CassandraTemplate.java:337) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.cql.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:83) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.cql.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:43) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.cql.CqlTemplate.query(CqlTemplate.java:298) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.cql.CqlTemplate.query(CqlTemplate.java:320) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.core.CassandraTemplate.select(CassandraTemplate.java:337) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.repository.query.CassandraQueryExecution$CollectionExecution.execute(CassandraQueryExecution.java:136) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.repository.query.CassandraQueryExecution$ResultProcessingExecution.execute(CassandraQueryExecution.java:262) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.cassandra.repository.query.AbstractCassandraQuery.execute(AbstractCassandraQuery.java:105) ~[spring-data-cassandra-3.1.3.jar:3.1.3] 在 org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.4.3.jar:2.4.3] 在 org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.4.3.jar:2.4.3] 在 org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:152) ~[spring-data-commons-2.4.3.jar:2.4.3] 在 org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:131) ~[spring-data-commons-2.4.3.jar:2.4.3] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.3.jar:5.3.3] 在 org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80) ~[spring-data-commons-2.4.3.jar:2.4.3] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.3.jar:5.3.3] 在 org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.3.jar:5.3.3] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.3.jar:5.3.3] 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.3.jar:5.3.3] 在 com.sun.proxy.$Proxy117.findByIdSensor(未知来源)~[na:na] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_152] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_152] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_152] 在 java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_152] 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.3.3.jar:5.3.3] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.3.3.jar:5.3.3] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.3.jar:5.3.3] 在 org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.3.jar:5.3.3] ...省略了63个常用框架

【问题讨论】:

只是好奇,但是当您从存储库代码中删除 @AllowFiltering 时会发生什么?这不是生产应用程序中应该有的东西。 当我删除 @AllowFiltering 时,spring boot 框架返回此消息:Query; CQL [com.datastax.oss.driver.internal.core.cql.DefaultSimpleStatement@d8a9e7d1]; Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING; 【参考方案1】:

虽然错误消息指示 NPE(空指针异常),但我认为这掩盖了这里的根本问题。但是,删除ALLOW FILTERING时显示的错误信息:

Cannot execute this query as it might involve
data filtering and thus may have unpredictable
performance. If you want to execute this query
despite the performance unpredictability, use
ALLOW FILTERING;

...更具启发性。

这告诉我基础表不是由 UUID 键控的。这意味着 Cassandra 必须(详尽地)扫描每个节点上的所有分区以构建结果集。它可能在 cqlsh 中有效,因为查询超时阈值设置为高于 Spring 的。

至于如何解决这个问题,我建议创建一个新表来支持此查询,并使用基于该 UUID 的分区键。这将阻止每个节点成为查询的一部分。

如果无法做到这一点,您可以尝试在该列上添加二级索引。二级索引在具有近乎唯一基数的情况下通常表现不佳(这就是为什么构建新表确实是最好的选择),但它可能会比使用 ALLOW FILTERING 指令表现更好。

【讨论】:

谢谢!这就是重点。我会尝试创建一个新表。

以上是关于org.springframework.data.annotation.Transient 和 javax.persistence.Transient 的区别的主要内容,如果未能解决你的问题,请参考以下文章

添加 HAL 浏览器时出错:找不到依赖项 'org.springframework.data:spring-data-rest-hal-browser:'

嵌套异常是 java.lang.NoClassDefFoundError: org/springframework/data/mapping/IdentifierAccessor

MongoDB $addFields 使用 org.springframework.data.mongodb.core.MongoTemplate

org.springframework.data.annotation.Transient 和 javax.persistence.Transient 的区别

@Transient 注解、@org.springframework.data.annotation.Transient 注解、transient 关键字和密码存储

org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception