将外键添加到复合主键并更改 JPA 实体 class

Add a foreign key to composite primary key and changes in JPA Entity class

我有一个 class 用户,其主键 (id) 对应于 SQL 服务器数据库中的 'user' table。我的用户 class 与项目实体存在多对一关系。

  public class User{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @JoinColumn(name = "project", referencedColumnName = "id_project")
    @ManyToOne(optional = false)
    private Project project;
    }

数据库:

CREATE TABLE [dbo].[user](
    [id] [int] IDENTITY(27,1) NOT NULL,
    [name] [varchar](45) NULL,
    [project] [int] NOT NULL,
 CONSTRAINT [PK_user_1] PRIMARY KEY CLUSTERED 
(
 [id] ASC)

现在在我的数据库中我需要有两行具有相同的用户 ID 但不同的项目所以我将我的主键更改为我的用户 table.

中的复合主键
   user table:        id  name  id_project
                    ---------------------------
                       1   John      5
                       1   John      6

   project table:     id    name  
                    ---------------
                       5   Project5     
                       6   Project6

并像这样改变了我的 table

  CREATE TABLE [dbo].[user](
        [id] [int] IDENTITY(27,1) NOT NULL,
        [name] [varchar](45) NULL,
        [project] [int] NOT NULL,
     CONSTRAINT [PK_user_1] PRIMARY KEY CLUSTERED 
    (
    [id] ASC,
    [project_mode] ASC)

我的问题是:我的 table 是否需要执行此步骤?如果是,那么如何更改我的用户 class?

的@id

我强烈建议您看一下关系数据库的常规形式。特别是Third Normal Form

在这种情况下,我会保留 table user 而没有列 id_project。相反,您可以使用列 id_userid_project 创建第三个 table user_project,它们都是主键的一部分。这是在关系数据库中对 n:m 关系建模的常用方法。

JPA 2.1 允许派生 ID,允许您将关系标记为 ID 的一部分。用户看起来像这样:

@Entity
@IdClass(UserPK.class)
public class User{
    @Id
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @Id
    @JoinColumn(name = "project", referencedColumnName = "id_project")
    @ManyToOne(optional = false)
    private Project project;
}

public class UserPK{
    private Integer id;
    private Integer project;//use the same type as the Project's ID.
}