【发布时间】:2014-07-15 21:51:32
【问题描述】:
我目前正在研究 Hibernate(使用 Spring,如果重要的话),我尝试制作一个小型 Web 应用程序,有人可以在其中注册和登录。有一个受 Spring Security 保护的安全区域,我已经让我的UserDetailsService 工作了,所以 Spring Security 正在使用 Hibernate 进行登录。
现在我正在为新用户注册。我考虑了怎么做,然后我有了一个单独的激活表,它基本上有 3 列:activationId、username 和 activation_code。激活码可能是某种哈希值,但我猜它与这个问题无关。
我的问题基本上是,如何处理我的users 表和activations 之间的关系。我需要将activations 中的username 链接到users 表中的username。
我必须使用一对一映射吗?或者我怎样才能将另一个表中的一列准确链接到激活表中?
这是我的User 实体:
@Entity
@Table(name = "users")
public class User {
@Id
@Column(name = "username", unique = true, nullable = false, length = 45)
private String username;
@Column(name = "password", nullable = false, length = 64)
private String password;
@Column(name = "enabled", nullable = false)
private boolean enabled;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private Set<UserRole> userRole = new HashSet<UserRole>(0);
@Column(name = "name")
private String name;
@Column(name = "lastname")
private String lastname;
public User() {
}
public User(String username, String password, boolean enabled) {
this.username = username;
this.password = password;
this.enabled = enabled;
}
public User(String username, String password, boolean enabled, Set<UserRole> userRole) {
this.username = username;
this.password = password;
this.enabled = enabled;
this.userRole = userRole;
}
// Getters and setters for all attributes omitted
}
如果您也需要UserRole 实体,请告诉我,我会添加它,但我认为不需要它。这里也是我的UserActivationEntity的当前版本,当然还没有完成:
import javax.persistence.*;
@Entity
@Table(name = "activations")
public class UserActivation {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long activationId;
@Column(length = 64)
private String activationCode;
@Column
private String userName; // here we need some magic relationship
}
【问题讨论】:
-
什么是激活?用户是否有一次激活?激活是否只属于单个用户?
-
激活基本上只是一个临时记录,其中包含用于完成注册过程的激活码。当用户使用此代码激活他的帐户时,该记录将被删除。因此,一个用户将拥有一个 UserActivation,它可以在一段时间后被删除。