@Transient是org.springframework.data.annotation
中的一个注解,@JsonIgnore是com.fasterxml.jackson.annotation
中的一个注解,接下来使用一个实例来介绍两者在使用上的区别,先来建立一个实体类:
@Data
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
// @JsonIgnore
@Transient
private String sex;
这里使用的DB是MongoDB,使用JPA来连接MongoDB,这里就忽略MongoRepository的实现,直接来看使用部分:
@Slf4j
@RestController
@RequestMapping(path="/mongo")
public class MongoUserController {
@Autowired
private UserRepository userRepository;
@RequestMapping(path="/user",method=RequestMethod.GET)
public void insertUser() {
User user=new User();
user.setId(new ObjectId().toString());
user.setName("peach juice");
user.setSex("female");
user.setUpdateTimeStamp(new Date());
userRepository.save(user);
}
@RequestMapping(path="/users",method=RequestMethod.GET)
public List<User> getUsers() {
List<User> userList=userRepository.findAll();
return userList;
}
}
接下来分别做几组实验:
实验一: 只在字段上添加@Transient注解
// DB存储结果
// 结果中没有sex字段
{
"_id": {
"$oid": "64462acf1ce37c749b722ed4"
},
"name": "peach juice",
"_class": "com.learn.model.po.User"
}
// 读取结果
// 结果中含有sex字段,只是值为null
{
"id": "64462aa71ce37c749b722ed2",
"name": "peach juice",
"sex": null
}
实验二: 只在字段上添加@JsonIgnore注解
// DB存储结果
// 结果中有sex字段
{
"_id": {
"$oid": "644637c3bdd5ca1f2c0d0d4d"
},
"name": "peach juice",
"sex": "female",
"_class": "com.learn.model.po.User"
}
// 读取结果
// 结果中含没有sex字段
{
"id": "644637c3bdd5ca1f2c0d0d4d",
"name": "peach juice"
}
总结:
由上面的结果可以看出,如果实体中一个字段不想出现在查询结果中时,但是要在DB中存储时,可以使用@JsonIgnore注解
;如果实体中一个字段不想存储到DB时可以使用@Transient注解
。