我使用的代码类似于How to map one class with multiple tables in Hibernate/javax.persistance?
中列出的代码我正在尝试编写一个示例登录程序,基于上面的示例我将我的用户类映射到我存储密码字段的辅助表。现在当我检索回用户实体时。我还获得了辅助表字段,因此用户对象中也可以使用密码。
是否有可能,在注册期间我想使用辅助表存储方法,但是当我回读时。它不应该与用户一起返回密码?
我怎样才能做到这一点?我正在寻找像@transient这样的JPA方式忽略特定的列。
答案 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模式将尽最大努力与你作斗争:)
但......某种方式仍有可能:
使用Entity Listeners
:
@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;
}
}