gpt4 book ai didi

java - Hibernate:实体关系和额外表

转载 作者:太空宇宙 更新时间:2023-11-04 10:34:27 24 4
gpt4 key购买 nike

我正在为简单的 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 自己创建数据库)?有什么简单的解决办法吗?

最佳答案

如果您需要额外的表 - 您需要额外的实体。

用于存储与帖子相关的用户操作:

@Entity
@Table(name = "user_post_rate")
public class UserPostRate {

@OneToMany
private Post post;
@OneToOne
private User user;
private boolean upvote;
// ...
}

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

但是,您仍然需要将额定值的总和存储在某处(而不是一次又一次地计算)。

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

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

// skipped

private long score;
}

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

关于java - Hibernate:实体关系和额外表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49637566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com