【问题标题】: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,它可以在一段时间后被删除。

标签: java hibernate


【解决方案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 之间区别的更多详细信息:stackoverflow.com/questions/2452987/…
猜你喜欢
  • 2011-06-21
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 2011-01-24
  • 2021-08-18
  • 2012-04-17
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多