Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将外键添加到复合主键和JPA实体类中的更改_Java_Sql Server_Jpa_Eclipselink_Many To One - Fatal编程技术网

Java 将外键添加到复合主键和JPA实体类中的更改

Java 将外键添加到复合主键和JPA实体类中的更改,java,sql-server,jpa,eclipselink,many-to-one,Java,Sql Server,Jpa,Eclipselink,Many To One,我有一个类User,它的主键(id)对应于SQLServer数据库中的“User”表。我的用户类与项目实体具有多对一关系 public class User{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id") private Integer id; @JoinColumn(name = "p

我有一个类User,它的主键(id)对应于SQLServer数据库中的“User”表。我的用户类与项目实体具有多对一关系

  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)

我的问题是:我的表格中是否需要此步骤?如果是这样的话,那么我该如何更改我的用户类的@id呢?

我郑重建议您看看关系数据库的正常形式。尤其是


在这种情况下,我将保留表
user
,而不保留列
id\u project
。相反,您可以使用列
id\u user
id\u project
创建第三个表
user\u 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.
}

这对我来说毫无意义,因为当你搜索一个特定的“用户”时,你会期望得到什么?如果将用户表规范化为单独的用户和用户项目关系表,该表是否更有意义?然后,用户和项目之间将是一个简单的M:M关系。排序在单用户表的情况下不起作用,因为它应该防止重复使用ID值——具有两个项目的用户“John”将分配两个唯一的ID。