Java 组合主键是最佳解决方案吗?Hibernate Spring

Java 组合主键是最佳解决方案吗?Hibernate Spring,java,spring,hibernate,composite-primary-key,Java,Spring,Hibernate,Composite Primary Key,我正在用Spring、Hibernate和JPA构建一个聊天应用程序,我想要两个表——聊天和消息。聊天时会有很多信息,也包括id和user_first和user_second。现在,我使用一个复合主键,其中复合主键是user_first和user_second,id是唯一的自动增量: public class ChatPK implements Serializable { protected int firstUser; protected int secondUser; .

我正在用Spring、Hibernate和JPA构建一个聊天应用程序,我想要两个表——聊天和消息。聊天时会有很多信息,也包括id和user_first和user_second。现在,我使用一个复合主键,其中复合主键是user_first和user_second,id是唯一的自动增量:

public class ChatPK implements Serializable {
    protected int firstUser;

    protected int secondUser;
... 

@Entity
@IdClass(ChatPK.class)
@Table(name = "chats1")
public class Chat implements Serializable {
    @Id
    private int firstUser;

    @Id
    private int secondUser;

    @Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private int id;
...
有没有更好的方法,为什么


更新:聊天是两个人之间的一个单独的行。不能有两个同一用户的聊天。我希望将我需要的所有消息与拥有这些消息的两个用户一起获取,这样我就可以将发送者id放入hashmap键中,并将消息放入一个值中。答案是,下面的SessionId与我的桌面聊天所做的是不同的,它以不同的方式实现了我想要的东西。

不,它不是最好的。主键的主要作用是带来唯一性,次键则是快速访问。密钥也用于缓存,因此密钥的大小将决定您可以缓存多少。制作复合ckey意味着您需要重写hashcode并尽可能使用equals。你把它复杂化了

显然,第一个用户Id和第二个用户Id不足以为您的聊天带来唯一性,因为您可以在同一用户之间拥有许多聊天会话

我认为您应该将id重命名为“sessionID”,将其用作主键,并将两个用户之间的两个关系置于主键之外

@Entity
@Table(name = "chats1")
public class Chat implements Serializable {
    @ManyToOne
    private User firstUser;

    @ManyToOne
    private User secondUser;

    @Id
    @Column(name = "sessionId")
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private int sessionId;
...

更新:这个问题变成了复合键的优缺点,这里已经详细讨论过了

否聊天意味着这是两个人之间的独特聊天,有很多信息不可能有两个人聊天我不知道你在构建什么,这是一个学生项目吗?这是一个真实世界的案例。从现实世界的情况来看,您将拥有基于用户的聊天唯一性的期望并不严重。即使你今天这么做了,我强烈建议你带上sessionId,即使你今天没有实际使用它,明天你可能会感谢我:)只要修改关系到OnToOne如果你坚持使用OneToOne为什么我需要会话Id?我不能使用日期吗?当用户打开聊天室时,它会收到一定数量的消息,然后当用户进一步滚动时,它会收到更多消息,这样就不会出现消息过载。这就是复合键的含义?2个人总是会有一个独特的聊天。你也可以使用日期。我个人更喜欢数字键,因为它们更有效。您也可以使用guid,或者只要精度足够高,就可以使用日期:)如果id字段不是您的实际id(主键),为什么要使用id字段?我要么删除id字段,要么将其设置为@id,并在其他两个字段的组合上添加一个唯一的约束。