知識庫 / JPA RSS 訂閱

@JsonIgnore 與 @Transient 的使用指南

Jackson,JPA
HongKong
11
09:48 PM · Dec 05 ,2025

1. 概述

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

2. <em @JsonIgnore

我們使用 註解來指定應在序列化和反序列化過程中忽略的方法或字段。

此標記註解屬於 Jackson 庫。

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

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

class Person implements Serializable {

    private Long id;

    private String firstName;

    private String lastName;

    // getters and setters
}

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

class Person implements Serializable {

    @JsonIgnore
    private Long id;

    private String firstName;

    private String lastName;

    // getters and setters
}

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

@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. <em @Transient>

另一方面,我們使用 > 註解來指示 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
}

讓我們從數據庫中移除 repeatedPassword 字段,該字段帶有 @Transient 註解,用於 User 對象表示中。

@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());
}

然而,<em data-annotation="Transient"></em> 註解並不會排除字段從序列化中排除:

@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. 結論

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

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

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

發佈 評論

Some HTML is okay.