F3R*_*3R1 14 jpa spring-security transient spring-annotations spring-data
目前我正在学习Spring框架,主要关注它的安全模块.我已经看过一些与注册和登录相关的指南.我在User类的密码字段中看到了transient关键字或@Transient注释的常见用法.
我的虚拟应用程序使用Spring Boot + Spring MVC + Spring Security + MySQL.
我知道
Java的transient关键字用于表示字段不是序列化的.
JPA的@Transient注释 ......
...指定属性或字段不是持久的.它用于注释实体类,映射的超类或可嵌入类的属性或字段.
和org.springframework.data.annotation的@Transient批注...
将字段标记为映射框架的瞬态字段.因此,该属性将不会被持久化,也不会被映射框架进一步检查.
在我的MySQL数据库中,我有spring_demo模式,它有3个表:
+-----------------------+
| Tables_in_spring_demo |
+-----------------------+
| role |
| user |
| user_role |
+-----------------------+
Run Code Online (Sandbox Code Playgroud)
当我在User类的密码字段中使用transient关键字时,它不会存储在MySQL数据库中.(例如:test01)
mysql> select * from user;
+----+--------+------------------+----------+
| id | active | email | username |
+----+--------+------------------+----------+
| 1 | 1 | test01@gmail.com | test01 |
+----+--------+------------------+----------+
1 row in set (0,00 sec)
Run Code Online (Sandbox Code Playgroud)
当我在User类的密码字段上使用javax.persistence @Transient注释时,它也不会存储在MySQL数据库中.(例如:test02)
但是......当我在User类的密码字段上使用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 | $2a$10$UbvmdhfcKxSNr/I4CjOLtOkKGX/j4/xQfFrv3FizxwEVk6D9sAoO |
+----+--------+------------------+----------+--------------------------------------------------------------+
2 rows in set (0,00 sec)
Run Code Online (Sandbox Code Playgroud)
我的主要问题是,当我使用基于spring.data的@Transient注释时,密码字段已经存在.为什么?为什么我要在密码字段上使用任何@Transient注释?
感谢您的指导和帮助!
Shi*_*nha 20
在Spring Framework中,您可以使用Mapping Framework将一种形式转换为另一种形式.比如说你的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;
}
Run Code Online (Sandbox Code Playgroud)
现在要将这个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"
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你添加:
@org.springframework.data.annotation.Transient
@Column(name = "password")
private String password;
Run Code Online (Sandbox Code Playgroud)
然后使用Mapping Framwwork再次为您将获得的用户2实体生成JSON:
{
"id": 2,
"email": "test03@gmail.com",
"username": "test03",
}
Run Code Online (Sandbox Code Playgroud)
请注意,JSON输出中缺少密码字段.多数民众赞成因为 @org.springframework.data.annotation.Transient特别声明弹簧框架,您使用的Object Mapper在从Java Object转换为JSON时不应包含此值.
另请注意,如果您尝试将上述实体持久存储到数据库中,它仍会将其保存到数据库中,因为它@org.springframework.data.annotation.Transient仅适用于对象映射框架而非JPA.
所以回顾一下:
transient适用于所有序列化(通过线程,保存到磁盘,保存到db)
javax.persistence.Transient是专门用于JPA DB序列化@org.springframework.data.annotation.Transient是用于Spring中使用的ObjectMapping Framework序列化
| 归档时间: |
|
| 查看次数: |
22802 次 |
| 最近记录: |