Java 将外键添加到复合主键和JPA实体类中的更改
我有一个类User,它的主键(id)对应于SQLServer数据库中的“User”表。我的用户类与项目实体具有多对一关系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
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。