У меня есть класс User с первичным ключом (id), который соответствует таблице "user" в базе данных SQL Server. Класс My 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)
Теперь в моей базе данных мне нужно иметь две строки с одинаковыми идентификаторами пользователей, но с разными проектами, поэтому я изменил свой первичный ключ на составной первичный ключ в моей пользовательской таблице.
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?
JPA 2.1 позволяет получать идентификаторы, позволяя вам определять отношения как часть идентификатора. Пользователь будет выглядеть так:
@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 ID.
}
Я бы серьезно рекомендовал взглянуть на обычные формы реляционных баз данных. Особенно третья нормальная форма.
В этом случае я бы сохранил user
таблицы без id_project
столбца. Вместо этого вы можете создать третью таблицу user_project
с помощью столбца id_user
и id_project
, которые являются частью первичного ключа. Это обычный способ моделирования отношения n:m
в реляционной базе данных.