JPA: @JoinTable - оба столбца являются первичными ключами. Как мне это остановить? - PullRequest
1 голос
/ 01 октября 2011

Это моя аннотация, которую я использую для создания своей таблицы соединений.

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "service_operations", 
        joinColumns = { @JoinColumn(name = "serviceId") },
        inverseJoinColumns = { @JoinColumn(name = "operationId") })
public Set<Operation> getOperations() {
    return operations;
}

Учитывая, что это ассоциация OneToMany, мое естественное предположение состоит в том, что эта таблица будет генерировать

[Первичный ключ |Внешний ключ], однако каждый раз, когда я удаляю и заново создаю базу данных, это не так:

mysql> describe workflow_services;
+-------------+------------+------+-----+---------+-------+
| Field       | Type       | Null | Key | Default | Extra |
+-------------+------------+------+-----+---------+-------+
| workflow_id | bigint(20) | NO   | PRI | NULL    |       |
| service_id  | bigint(20) | NO   | PRI | NULL    |       |
+-------------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

Я немного сбит с толку этим.Есть предложения?

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Я исправил свою проблему, добавив следующие изменения:

Я изменил свой @OneToMany на аннотацию @ManyToMany

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "workflow_services", 
        joinColumns = @JoinColumn(name = "workflow_id"), 
        inverseJoinColumns = @JoinColumn(name = "service_id"))
public Set<Service> getServices() {
    return services;
}

Я добавил набор рабочих процессов; ассоциация в моем сервисном объекте

@ManyToMany(mappedBy="services")  // map info is in person class
public Set<Workflow> getWorkflows() {
    return workflows;
}
2 голосов
/ 01 октября 2011

Это выглядит правильно для меня. Каждая строка в таблице соединений должна идентифицировать пару элементов рабочего процесса / службы. Так что (workflow_id, service_id) должен быть первичным ключом. Также workflow_id должен быть внешним ключом в таблице workflow, а service_id должен быть внешним ключом в таблице service.

Также обратите внимание, что связь «один ко многим» между A и B не означает, что экземпляр A может иметь один и тот же экземпляр B несколько раз, скорее, экземпляр A может иметь несколько различных экземпляров B. сущность блога Post может иметь связь один-ко-многим с сущностью Tag. Это означает, что блог Post P1 может иметь несколько тегов Java, JPA, JavaEE, но не может иметь один и тот же тег несколько раз.

...