Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa @瞬态注释,@org.springframework.data.annotation.Transient注释,瞬态关键字和密码存储_Jpa_Spring Security_Spring Data_Spring Annotations_Transient - Fatal编程技术网

Jpa @瞬态注释,@org.springframework.data.annotation.Transient注释,瞬态关键字和密码存储

Jpa @瞬态注释,@org.springframework.data.annotation.Transient注释,瞬态关键字和密码存储,jpa,spring-security,spring-data,spring-annotations,transient,Jpa,Spring Security,Spring Data,Spring Annotations,Transient,目前我正在学习Spring框架,主要关注它的安全模块。我看了一些关于注册和登录的指南。我在用户类的密码字段中看到了transient关键字或@transient注释的这种常见用法 我的虚拟应用程序使用SpringBoot+SpringMVC+SpringSecurity+MySQL 我知道 Java的transient关键字用于表示字段不被序列化 JPA的瞬态注释 …指定属性或字段不是持久的。它用于注释实体类、映射超类或可嵌入类的属性或字段 以及org.springframework.data.

目前我正在学习Spring框架,主要关注它的安全模块。我看了一些关于注册和登录的指南。我在用户类的密码字段中看到了transient关键字或@transient注释的这种常见用法

我的虚拟应用程序使用SpringBoot+SpringMVC+SpringSecurity+MySQL

我知道

Java的transient关键字用于表示字段不被序列化

JPA的瞬态注释

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

以及org.springframework.data.annotation的@Transient annotation..

将字段标记为映射框架的临时字段。因此,属性不会被持久化,也不会被映射框架进一步检查

在我的MySQL db中,我有我的spring_演示模式,它有3个表:

+-----------------------+
| Tables_in_spring_demo |
+-----------------------+
| role                  |
| user                  |
| user_role             |
+-----------------------+
当我在User类的password字段中使用transient关键字时,它不会存储在MySQL数据库中。(示例:test01)

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

但是。。。当我在用户类的密码字段上使用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)
我的主要问题是,当我使用spring.data-based@Transient注释时,密码字段一直存在。为什么?为什么要在密码字段上使用@Transient注释?

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框架中,您可以使用映射框架从一种形式转换为另一种形式。例如,假设您的SpringJava服务器端应用程序需要以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": "$2a$10$UbvmdhfcKxSNr/I4CjOLtOkKGX/j4/xQfFrv3FizxwEVk6D9sAoO"
}
现在,如果您添加:

@org.springframework.data.annotation.Transient
@Column(name = "password")
private String password;
然后使用映射框架再次为您将获得的user 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
适用于所有序列化(通过线路、保存到磁盘、保存到数据库)
javax.persistence.Transient
专门用于JPADB序列化
@org.springframework.data.annotation.Transient
用于Spring中使用的ObjectMapping框架序列化


如果目的不是在保存时忽略该字段,则可以使用@Transient private Transient String password;我现在正在学习Spring和Spring安全性,这是一个非常有帮助的答案,它的细节和清晰度都非常好。在试图弄明白为什么我的密码字段不能持久保存到数据库时,我有点发疯了。非常感谢。