代码之家  ›  专栏  ›  技术社区  ›  Taserface

为什么实体的getter被调用两次?

  •  0
  • Taserface  · 技术社区  · 3 年前

    我将Spring Boot与Hibernate结合使用。我有一个包含一些凭据的实体:

    @Entity
    class MyEntity {
    
        @Column(name = "credentials", columnDefinition = "jsonb")
        @Type(type = "jsonb")
        private Map<String, Object> credentials;
    }
    

    每次读取和保存凭据时,我都会使用自定义的“encode(credentials)”和“decode(creentials)”方法,只在数据库中保留编码版本,并在其他任何地方使用解码版本。这就是我的getter的样子:

        public Map<String, Object> getCredentials() {
            Map<String, Object> encryptedCredentials = decode(this.credentials);
            return encryptedCredentials;
        }
    

    但出于某种奇怪的原因,它似乎被调用了两次,其中一次(第一次)是隐式调用,调试器并没有就此停止。为什么我认为它被调用了两次?因为当我调试它时 this.credentials 已被解码。然而,当我有这样的getter方法时:

        public Map<String, Object> getCredentials() {
            Map<String, Object> encryptedCredentials = this.credentials;
            return encryptedCredentials;
        }
    

    我在调试过程中获得的凭据不会被解密,这意味着getter会被调用两次。奇怪的Hibernate在这里有什么魔力?我应该遵循哪些最佳实践来避免它?

    0 回复  |  直到 3 年前