我正在为简单的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和rate中使用数据库中的单独表,但是我怎么能在Hibernate中做到这一点(Hibernate自己创建数据库)?对此有什么简单的解决方案吗?
答案 0 :(得分:0)
如果您需要额外的表格,则需要额外的实体。
用于存储与post相关的用户操作:
@Entity
@Table(name = "user_post_rate")
public class UserPostRate {
@OneToMany
private Post post;
@OneToOne
private User user;
private boolean upvote;
// ...
}
如果您有两个与boolean
相关的固定操作,则可能只有post
值。你可以用一些整数值替换它,例如,如果特权用户可以为+ n
上传它,或者用户可以在一段时间之后再次投票。
但是,您仍然需要将某个额定值的总和存储在某个地方(而不是一次又一次地计算)。
当存储与用户帖子相关的操作时,整体post
分数不是存储在同一个表中的好地方,因为您将在此处保留许多不必要的重复项(直到您需要跟踪发表评分历史)。您可以将其存储在Post
实体中,因为帖子的分数是其状态的一部分:
@Entity
@Table(name = "post")
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
// skipped
private long score;
}
每次用户对帖子进行评分时,都应触发帖子实体评分的更新。