Добавление внешнего ключа в составной первичный ключ и изменения в классе сущности JPA

1

У меня есть класс 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?

  • 1
    Это не имеет смысла для меня, как то, что вы собираетесь ожидать назад, когда вы будете искать конкретного «пользователя»? Разве таблица не имела бы больше смысла, если бы вы нормализовали таблицу User в отдельную таблицу отношений User и User_projects? Тогда это будут простые отношения M: M между пользователем и проектами. Секвенирование не будет работать в случае таблицы с одним пользователем, так как это должно предотвратить повторное использование значений идентификаторов - пользователю «Джон» с двумя проектами будет назначено два уникальных идентификатора.
Теги:
sql-server
jpa
eclipselink
many-to-one

2 ответа

1
Лучший ответ

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

Я бы серьезно рекомендовал взглянуть на обычные формы реляционных баз данных. Особенно третья нормальная форма.

В этом случае я бы сохранил user таблицы без id_project столбца. Вместо этого вы можете создать третью таблицу user_project с помощью столбца id_user и id_project, которые являются частью первичного ключа. Это обычный способ моделирования отношения n:m в реляционной базе данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню