【问题标题】:Add a foreign key to composite primary key and changes in JPA Entity class将外键添加到复合主键和 JPA 实体类中的更改
【发布时间】:2015-04-10 11:48:41
【问题描述】:

我有一个用户类,其主键 (id) 对应于 SQL Server 数据库中的“用户”表。我的 User 类与 Project Entity 具有多对一的关系。

  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 但不同项目的行,因此我将主键更改为用户表中的复合主键。

   user table:        id  name  id_project
                    ---------------------------
                       1   John      5
                       1   John      6

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

像这样改变我的桌子

  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)

我的问题是:我的表格中是否需要执行此步骤?如果是,那么我该如何更改我的 User 类的 @id?

【问题讨论】:

  • 这对我来说没有意义,因为当您搜索特定的“用户”时,您会期待什么?如果您将 User 表标准化为单独的 User 和 User_projects 关系表,该表会不会更有意义?那么这将是用户和项目之间的简单 M:M 关系。排序在单个用户表的情况下不起作用,因为它应该防止重复使用 ID 值 - 具有两个项目的用户“John”将分配两个唯一的 ID。

标签: java sql-server jpa eclipselink many-to-one


【解决方案1】:

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.
}

【讨论】:

    【解决方案2】:

    我强烈建议您查看关系数据库的正常形式。尤其是Third Normal Form

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      相关资源
      最近更新 更多