在存储实体时使用JPA实体映射,但在回读

时间:2016-01-02 02:42:24

标签: jpa entity

我使用的代码类似于How to map one class with multiple tables in Hibernate/javax.persistance?

中列出的代码

我正在尝试编写一个示例登录程序,基于上面的示例我将我的用户类映射到我存储密码字段的辅助表。现在当我检索回用户实体时。我还获得了辅助表字段,因此用户对象中也可以使用密码。

是否有可能,在注册期间我想使用辅助表存储方法,但是当我回读时。它不应该与用户一起返回密码?

我怎样才能做到这一点?我正在寻找像@transient这样的JPA方式忽略特定的列。

1 个答案:

答案 0 :(得分:0)

我不会去实施。

最佳做法是从不存储明文密码,而是存储摘要:

@Entity
public class Account
{
    @Column
    private String username;

    @Column(length = 32)
    private String password;

    public String getUsername()
    {
        return username;
    }

    public void setUsername(String username)
    {
        this.username = username;
    }

    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = DigestUtils.md5Hex(password);
    }
}

这是一个不常见的要求,JPA模式将尽最大努力与你作斗争:)

但......某种方式仍有可能:

  1. 使用Entity Listeners

    @Entity
    public class Account
    {
        @Column
        private String username;
    
        @Column
        private String password;
    
        @PostLoad
        public void postLoad()
        {
            password = null;
        }
    }
    

    要小心:在事务中加载时,最终可能会在提交时刷新空密码。

  2. 删除密码的getter:
    如果只在字段上添加注释,则可以删除getPassword()方法。即使字段是在加载时填充的,外部Java代码也无法访问它。

  3. 使用@Transient组合:

    @Entity
    public class Account
    {
        @Column
        private String username;
    
        @Column
        private String password;
    
        @Transient
        private String password2;
    
        public String getPassword()
        {
            return password2;
        }
    
        public void setPassword(String password)
        {
            this.password = password;
            this.password2 = password;
        }
    }