我正在为简单的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;
}
用户每次对帖子进行评分时,都应触发邮政实体分数的更新。