将外键添加到复合主键并更改 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_user
和 id_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.
}
我有一个 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_user
和 id_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.
}