@JsonIgnore 與 @Transient

Jackson,JPA
Remote
0
08:47 PM · Nov 30 ,2025

1. 概述

在本簡短教程中,我們將學習 @JsonIgnore@Transient 註解之間的區別。

2.

我們使用 註解來指定在序列化和反序列化過程中應被忽略的方法或字段。此標記註解屬於 Jackson 庫。

我們通常將此註解應用於可能不相關或可能包含敏感信息的字段。我們使用它來標記我們希望忽略的屬性,無論是字段還是方法。

首先,讓我們創建一個簡單的 類,其中包含幾個字段:

class Person implements Serializable {

    private Long id;

    private String firstName;

    private String lastName;

    // getters and setters
}

現在,假設我們不想在 對象的 JSON 表示中顯示 字段。讓我們使用 註解來排除該字段:

class Person implements Serializable {

    @JsonIgnore
    private Long id;

    private String firstName;

    private String lastName;

    // getters and setters
}

最後,讓我們編寫一個測試以確保 忽略 字段:

@Test
void givenPerson_whenSerializing_thenIdFieldIgnored()
  throws JsonProcessingException {

    Person person = new Person(1L, "My First Name", "My Last Name");
    String result = new ObjectMapper().writeValueAsString(person);

    assertThat(result, containsString("firstName"));
    assertThat(result, containsString("lastName"));
    assertThat(result, not(containsString("id")));
}

3.

另一方面,我們使用 註解來指示 Java 持久性 API (JPA) 在將對象映射到數據庫時應忽略該字段。 當我們用此註解標記一個字段時,JPA 不會持久化該字段,也不會從數據庫檢索其值。

現在,讓我們創建一個 User 類:

@Entity
@Table(name = "Users")
class User implements Serializable {

    @Id
    private Long id;

    private String username;

    private String password;

    private String repeatedPassword;

    // getters and setters
}

讓我們使用 註解從數據庫表示的 User 對象中排除 repeatedPassword 字段:

@Entity
@Table(name = "User")
class User implements Serializable {

    @Id
    private Long id;

    private String username;

    private String password;

    @Transient
    private String repeatedPassword;

    // getters and setters
}

當我們將 User 對象持久化到數據庫時,JPA 不會保存 repeatedPassword 值到數據庫。 此外,JPA 在從數據庫加載對象時會忽略該字段:

@Test
void givenUser_whenSave_thenSkipTransientFields() {
    User user = new User(1L, "user", "newPassword123", "newPassword123");
    User savedUser = userRepository.save(user);

    assertNotNull(savedUser);
    assertNotNull(savedUser.getPassword());
    assertNull(savedUser.getRepeatedPassword());
}

然而, 註解不會排除字段在序列化中的出現:

@Test
void givenUser_whenSerializing_thenTransientFieldNotIgnored() throws JsonProcessingException {

    User user = new User(1L, "user", "newPassword123", "newPassword123");
    String result = new ObjectMapper().writeValueAsString(user);

    assertThat(result, containsString("user"));
    assertThat(result, containsString("repeatedPassword"));
}

4. 結論

在本文中,我們學習了 @JsonIgnore@Transient 註解之間的區別。

總而言之,這兩個註解都用於指示在執行某些操作時應忽略的字段。@JsonIgnore 註解從 JSON 表示中排除這些字段。@Transient 註解則從數據庫表示中省略它們。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.