我需要选择哪种关系?
Posted
技术标签:
【中文标题】我需要选择哪种关系?【英文标题】:Which kind of relation do I need to pick? 【发布时间】: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
实体,请告诉我,我会添加它,但我认为不需要它。这里也是我的UserActivation
Entity的当前版本,当然还没有完成:
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,它可以在一段时间后被删除。 【参考方案1】:您可以使用ManyToOne
映射:
@Entity
@Table(name = "activations")
public class UserActivation
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long activationId;
@Column(length = 64)
private String activationCode;
@ManyToOne(optional=false)
@JoinColumn(name="USER_NAME")
private User user; // since your User Id is username, the join column will be username
如果您希望用户名是唯一的,这意味着单个用户一次激活:
@Entity
@Table(name = "activations",uniqueConstraints=@UniqueConstraint(columnsnames="USER_NAME"))
【讨论】:
您好,感谢您的快速回复。 ManyToOne 不是意味着我为一个用户有很多激活吗?老实说,我目前还不太了解 ...To... 关系。 我更新了我的答案,如果您希望单个用户添加唯一约束,我更喜欢ManyToOne
+ 唯一约束而不是 OneToOne
,因为在单向映射和双向映射中都更易于管理跨度>
非常感谢您的帮助,如果这对我有用,我会尝试然后回复!祝你有个愉快的夜晚!
并查看此答案以了解有关 oneToOne 和 ManyToOne 之间区别的更多详细信息:***.com/questions/2452987/…以上是关于我需要选择哪种关系?的主要内容,如果未能解决你的问题,请参考以下文章