Hibernate:实体关系和额外表

时间:2018-04-03 19:14:11

标签: java 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和rate中使用数据库中的单独表,但是我怎么能在Hibernate中做到这一点(Hibernate自己创建数据库)?对此有什么简单的解决方案吗?

1 个答案:

答案 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;
}

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