@Transient注解,@org.springframework.data.annotation.Transient注解,transient关键字和密码存储
@Transient annotation, @org.springframework.data.annotation.Transient annotation, transient keyword and password storing
目前正在学习Spring框架,主要关注它的Security Module。我看过一些与注册和登录有关的指南。我在 User 的密码字段上看到 transient 关键字或 @Transient 注释的常见用法 class。
我的虚拟应用程序正在使用 Spring 引导 + Spring MVC + Spring 安全 + MySQL.
我知道
Java's transient keyword is used to denote that a field is not to be serialized.
JPA 的@Transient 注解...
...specifies that the property or field is not persistent. It is used to annotate a property or field of an entity class, mapped superclass, or embeddable class.
和org.springframework.data.annotation的@Transient注解...
Marks a field to be transient for the mapping framework. Thus the property will not be persisted and not further inspected by the mapping framework.
在我的 MySQL 数据库中,我有我的 spring_demo 模式,它有 3 个表:
+-----------------------+
| Tables_in_spring_demo |
+-----------------------+
| role |
| user |
| user_role |
+-----------------------+
当我在用户 class 的密码字段上使用 transient 关键字时,它不会存储在 MySQL 数据库中。 (示例:test01)
mysql> select * from user;
+----+--------+------------------+----------+
| id | active | email | username |
+----+--------+------------------+----------+
| 1 | 1 | test01@gmail.com | test01 |
+----+--------+------------------+----------+
1 row in set (0,00 sec)
当我在用户 class 的密码字段上使用 javax.persistence @Transient 注释时,它也不会存储在MySQL 分贝。 (示例:test02)
但是...当我在用户 class 的密码字段上使用 org.springframework.data.annotation @Transient 注释时,它确实存储在MySQL 分贝。 (示例:test03)这是为什么?
mysql> select * from user;
+----+--------+------------------+----------+--------------------------------------------------------------+
| id | active | email | username | password |
+----+--------+------------------+----------+--------------------------------------------------------------+
| 1 | 1 | test02@gmail.com | test02 | |
| 2 | 1 | test03@gmail.com | test03 | a$UbvmdhfcKxSNr/I4CjOLtOkKGX/j4/xQfFrv3FizxwEVk6D9sAoO |
+----+--------+------------------+----------+--------------------------------------------------------------+
2 rows in set (0,00 sec)
我的主要问题是,当我使用基于 spring.data 的 @Transient 注释时,密码字段一直存在。为什么?为什么我应该在密码字段上使用任何@Transient 注释?
在此先感谢您的指导和帮助!
在 Spring 框架内,您可以使用映射框架将一种形式转换为另一种形式。例如,您的 spring java 服务器端应用程序需要以 JSON 格式向客户端(网页、移动应用程序)发送用户信息。
@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": "a$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
明确向 spring 框架声明,当从 Java 对象转换为 JSON.
时,您使用的对象映射器不应包含此值
另请注意,如果您尝试将上述实体保存到数据库中,它仍会将其保存到数据库中,因为 @org.springframework.data.annotation.Transient
仅适用于对象映射框架而不适用于 JPA。
回顾一下:
transient
is for all serializations (over the wire, saving to disk, saving to db)
javax.persistence.Transient
is specifically for JPA DB serialization
@org.springframework.data.annotation.Transient
is for ObjectMapping Framework serializations used within Spring
目前正在学习Spring框架,主要关注它的Security Module。我看过一些与注册和登录有关的指南。我在 User 的密码字段上看到 transient 关键字或 @Transient 注释的常见用法 class。
我的虚拟应用程序正在使用 Spring 引导 + Spring MVC + Spring 安全 + MySQL.
我知道
Java's transient keyword is used to denote that a field is not to be serialized.
JPA 的@Transient 注解...
...specifies that the property or field is not persistent. It is used to annotate a property or field of an entity class, mapped superclass, or embeddable class.
和org.springframework.data.annotation的@Transient注解...
Marks a field to be transient for the mapping framework. Thus the property will not be persisted and not further inspected by the mapping framework.
在我的 MySQL 数据库中,我有我的 spring_demo 模式,它有 3 个表:
+-----------------------+
| Tables_in_spring_demo |
+-----------------------+
| role |
| user |
| user_role |
+-----------------------+
当我在用户 class 的密码字段上使用 transient 关键字时,它不会存储在 MySQL 数据库中。 (示例:test01)
mysql> select * from user;
+----+--------+------------------+----------+
| id | active | email | username |
+----+--------+------------------+----------+
| 1 | 1 | test01@gmail.com | test01 |
+----+--------+------------------+----------+
1 row in set (0,00 sec)
当我在用户 class 的密码字段上使用 javax.persistence @Transient 注释时,它也不会存储在MySQL 分贝。 (示例:test02)
但是...当我在用户 class 的密码字段上使用 org.springframework.data.annotation @Transient 注释时,它确实存储在MySQL 分贝。 (示例:test03)这是为什么?
mysql> select * from user;
+----+--------+------------------+----------+--------------------------------------------------------------+
| id | active | email | username | password |
+----+--------+------------------+----------+--------------------------------------------------------------+
| 1 | 1 | test02@gmail.com | test02 | |
| 2 | 1 | test03@gmail.com | test03 | a$UbvmdhfcKxSNr/I4CjOLtOkKGX/j4/xQfFrv3FizxwEVk6D9sAoO |
+----+--------+------------------+----------+--------------------------------------------------------------+
2 rows in set (0,00 sec)
我的主要问题是,当我使用基于 spring.data 的 @Transient 注释时,密码字段一直存在。为什么?为什么我应该在密码字段上使用任何@Transient 注释?
在此先感谢您的指导和帮助!
在 Spring 框架内,您可以使用映射框架将一种形式转换为另一种形式。例如,您的 spring java 服务器端应用程序需要以 JSON 格式向客户端(网页、移动应用程序)发送用户信息。
@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": "a$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
明确向 spring 框架声明,当从 Java 对象转换为 JSON.
另请注意,如果您尝试将上述实体保存到数据库中,它仍会将其保存到数据库中,因为 @org.springframework.data.annotation.Transient
仅适用于对象映射框架而不适用于 JPA。
回顾一下:
transient
is for all serializations (over the wire, saving to disk, saving to db)
javax.persistence.Transient
is specifically for JPA DB serialization@org.springframework.data.annotation.Transient
is for ObjectMapping Framework serializations used within Spring