我需要选择哪种关系?

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 列:activationIdusernameactivation_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,它可以在一段时间后被删除。 【参考方案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/…

以上是关于我需要选择哪种关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个切换使用哪种关系的开关?

不同SQL表之间的关系规则

对应分析不可以反映哪种关系

混淆在这两个表的模型中使用哪种关系

Laravel 关系一到两列

究竟哪种NoSQL数据库适合你?