@transient注释, @org.springframework.data.annotation.transient



当前我正在学习弹簧框架,主要关注其安全模块。我看了一些与注册和登录有关的指南。我看到了 transient 关键字的常见用法或@transient > user 类中的密码字段上的注释。

我的虚拟应用程序正在使用Spring Boot Spring MVC Spring Security MySQL。

我知道

java的瞬态关键字用于表示字段不被序列化。

jpa的@transient注释 ...

...指定属性或字段不持久。它用于注释实体类,映射超类或可嵌入类的属性或字段。

和org.springframework.data.annotation的@transient注释..

标记要为映射框架进行瞬态的字段。因此,属性将不会持续,也不会通过映射框架进行进一步检查。

在我的mysql db中,我有我的spring_demo模式,有3个表:

+-----------------------+
| Tables_in_spring_demo |
+-----------------------+
| role                  |
| user                  |
| user_role             |
+-----------------------+

当我在密码字段上使用 transient 关键字在用户类上时,它不会存储在MySQL DB中。(示例:test01)

mysql> select * from user;
+----+--------+------------------+----------+
| id | active | email            | username |
+----+--------+------------------+----------+
|  1 |      1 | test01@gmail.com | test01   |
+----+--------+------------------+----------+
1 row in set (0,00 sec)

当我使用 javax.persistence @transient 在用户类中的密码字段上注释时,它也不会存储在MySQL DB中。(示例:test02)

但是...当我使用 org.springframework.data.data.annotation @transient 在用户类中的密码字段上的注释中,它将存储在mySQL db中。(示例:test03)为什么?

mysql> select * from user;
+----+--------+------------------+----------+--------------------------------------------------------------+
| id | active | email            | username | password                                                     |
+----+--------+------------------+----------+--------------------------------------------------------------+
|  1 |      1 | test02@gmail.com | test02   |                                                              |
|  2 |      1 | test03@gmail.com | test03   | $2a$10$UbvmdhfcKxSNr/I4CjOLtOkKGX/j4/xQfFrv3FizxwEVk6D9sAoO  |
+----+--------+------------------+----------+--------------------------------------------------------------+
2 rows in set (0,00 sec)

我的主要问题是,当我使用基于spring.data的 @transient注释时,密码字段持续了。为什么?为什么我要在密码字段上使用任何 @transient注释?

感谢您的指导,并提前提供帮助!

在弹簧框架中您可以使用映射框架从一种形式转换为另一种形式。例如,以JSON格式将您的Spring Java服务器端应用程序需要发送到客户信息(网页,移动应用程序)。

@Entity
public class User {
@Id
private long id;
@Column(name = "username")
private String username;
@Column(name = "email")
private String email;
@Column(name = "password")
private String password;
}

现在要将此Java实体对象映射到JSON格式,您可以使用映射框架(例如Jackson:com.fasterxml.jackson.databind.ObjectMapper)或手动进行。

何时将用户2对象转换为json的JSON格式输出是:

{
   "id": 2,
   "email": "test03@gmail.com",
   "username": "test03",
   "password": "$2a$10$UbvmdhfcKxSNr/I4CjOLtOkKGX/j4/xQfFrv3FizxwEVk6D9sAoO"
}

现在添加:

@org.springframework.data.annotation.Transient
@Column(name = "password")
private String password;

然后使用映射框架再次为您获得的用户2实体生成JSON:

{
   "id": 2,
   "email": "test03@gmail.com",
   "username": "test03",
}

请注意,JSON输出中缺少密码字段。那是因为@org.springframework.data.annotation.Transient专门向弹簧框架指出,您使用的对象映射器在从Java对象转换为JSON时不应包括此值。

另外,请注意,如果您尝试将上述实体持续到数据库中,它仍然可以将其保存到数据库中,因为@org.springframework.data.annotation.Transient仅适用于对象映射框架而非JPA。

所以回顾一下:

transient用于所有序列化(在电线上,保存到磁盘,保存到DB)
javax.persistence.Transient专门用于JPA DB序列化 @org.springframework.data.annotation.Transient用于Spring

中使用的对象图框架序列化

最新更新