当前位置: 首页 > 知识库问答 >
问题:

存储实体时使用JPA实体映射,但回读时忽略字段或特定表

章永安
2023-03-14

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

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

有没有可能,在注册的时候我想用二次表存储的方法,但是当我回读的时候。它不应该与用户一起返回密码?

我怎样才能做到这一点呢?我正在寻找一些JPA方式,比如@transient忽略特定列。

共有1个答案

费学
2023-03-14

我不赞成这样的实施。

最佳实践是永远不要存储明文密码,而是存储摘要:

@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模式将竭尽全力与您对抗:)

但是...某种方式仍然是可能的:

>

  • 使用实体侦听器:

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

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

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

    使用@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;
        }
    }
    

  •  类似资料:
    • 我在JPA实体类中有问题。这个实体工作正常,但今天我添加了另一个字段(一个简单的字符串,varchar(255)在数据库中不为NULL)。当我尝试持久化一个新实体时,我得到 嗯,这是真的。该列没有默认值。但在我的代码中,我为它设置了值。查看生成的insert语句时,该字段不存在。 变量的名称与列名匹配,因此没有可能导致错误的注释。它的处理方式与其他工作正常的字段/列一样。 提前感谢您的帮助! 编辑

    • 快速总结我想要实现的目标。请给出实施或设计建议:) 我有两个表:用户,图像。在UserDO中,我希望保留一组所有用户的图像,以及单个图像,即用户的肖像(在我的示例中,该组将包括肖像): 在ImageDO中,我有一个userid作为外键来记录哪个用户上传了图像。但是它没有布尔值,因为认为一个用户可能会上传许多图像,但只有一个是肖像。 有什么方法可以实现这一点吗?或者我需要维护另一个表(例如,Port

    • 是否有可能不在HiberNate中的实体层次结构中间为类创建表? 我想指出某些实体是某种类型的子集,以便返回所有这些实体的集合,但我不会在此中间类型中放置任何额外的属性。因此,保留带有id字段的额外表只是为了连接表,这听起来并不好。 更好的解决方案是实现一些公共接口< code>CommonInterface,但是这样我就失去了返回< code>List的可能性

    • 我有一个实体,它有一个Map ElementCollection字段。我知道使用Jpa,您可以在类级别上使用@Index注释为常规字段定义索引。问题是我的地图元素集合字段创建了一个不是由@Entity注释类创建的连接表。所以我不能使用@Index注释。有没有Jpa/Hibernate方法来定义这个连接表中字段的索引,或者我必须手动定义它们?这是地图字段。 谢谢

    • 问题内容: 如何保存hibernate实体并忽略(不正确)瞬态模式。 例如: 我想保存它: 弹簧产生错误: 问题答案: 参见http://docs.jboss.org/hibernate/validator/4.2/reference/en- US/html_single/#validator-checkconstraints- orm 。默认情况下,Hibernate(ORM)检查默认验证组的每

    • 我在JPA实体映射方面有问题。我有一些课: A级 类别b Classc *如何解决这个问题?*我还能使用类继承吗?还是另一个解决这个的方法? 谢了。