Hibernate:实体关系和额外的表格



我正在为简单的Web应用程序创建评级系统,该应用程序允许用户发布与Twitter墙相似的文本。我有两个实体:

第一个:

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Column(unique = true)
    private String login;
    private String hashPassword;
    private String name;
    private String surname;
    @Column(unique = true)
    private String email;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "connectedUser", fetch = FetchType.EAGER)
    private List<Post> userPosts = new ArrayList<>();

第二个:

@Entity
@Table(name = "post")
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String text;
    @NotNull
    private LocalDateTime postDate;
    @ManyToOne(optional = false)
    @JoinColumn(name = "user_id")
    private User connectedUser;

我正在尝试弄清楚,在哪里/如何添加负责评级的东西。每个用户(加上或负(可以对每个帖子进行评分,并且应在附近显示总费率。看起来很简单,我需要在数据库中使用User_ID,Post_id和速率单独的表,但是我该如何在Hibernate中进行(Hibernate本身创建数据库(?有什么简单的解决方案吗?

如果您需要其他表格 - 您需要其他实体。

用于存储与发布有关的用户操作:

@Entity
@Table(name = "user_post_rate")
public class UserPostRate {
    @OneToMany
    private Post post;
    @OneToOne
    private User user;
    private boolean upvote;
    // ...
}

如果您有两个与post相关的固定操作,则可能只是boolean值。您可以用一些整数值替换它,例如,如果特权用户可以为+ n上演它,或者用户可以在一段时间后再次将其重新投票。

但是,您仍然需要在某个地方存储额定值的总和(不要一次又一次地计算它(。

当存储用户与用户相关的操作时,总体post分数不是一个不错的地方,因为您将在此处保留许多不必要的重复项(直到您需要跟踪后分数历史记录(。您可以将其存储在Post实体中,因为帖子的分数是其状态的一部分:

@Entity
@Table(name = "post")
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    // skipped
    private long score;
}

用户每次对帖子进行评分时,都应触发邮政实体分数的更新。

最新更新