Как добавить отдельный первичный ключ в таблицу соединений в Hibernate - PullRequest
7 голосов
/ 21 сентября 2010

У меня есть вопрос по поводу отображений Hibernate ManyToMany.У меня есть два класса A и B, и отображение между ними является отображением ManyToMany, разрешенным с помощью Hibernate:

@Entity
@Table(name="A")
public class A {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToMany
    @JoinTable(name="C", joinColumns=@JoinColumn(name="a_id"), inverseJoinColumns=@JoinColumn(name="b_id"))
    private Set bs;
}

@Entity
@Table(name="B")
public class B {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToMany(mappedBy="bs")
    private Set bs;
}

Как видите, используемая таблица соединений - C. Внешние ключи к A и B"a_id" и "b_id".Насколько я понимаю, Hibernate создает составной первичный ключ с a_id и b_id для таблицы C.

Я не хочу иметь объект C в моей модели.Но вместо составного первичного ключа в таблице C я хотел бы иметь сгенерированный идентификатор и уникальное ограничение для полей a_id и b_id.

Можно ли указать Hibernate использовать отдельный первичный ключ?Без добавления сущности C?

Буду признателен за любую помощь.

Большое спасибо!

Ответы [ 3 ]

6 голосов
/ 28 февраля 2012

Вы должны сделать это так.Но это может быть применено только для списка (не для наборов)

@Entity
@TableGenerator(name="ids_generator", table="IDS")
public class Passport {
    ...

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name="PASSPORT_VISASTAMP")
    @CollectionId(
        columns = @Column(name="COLLECTION_ID"), 
        type=@Type(type="long"), 
        generator = "ids_generator"
    )
    private Collection<Stamp> visaStamp = new ArrayList();
    ...
}
1 голос
/ 21 сентября 2010

Но вместо составного первичного ключа в таблице C я хотел бы иметь сгенерированный идентификатор и уникальное ограничение для полей a_id и b_id.

Обычно первичный ключ JoinTable состоит из комбинации обоих внешних ключей. По крайней мере, это то, что JPA будет генерировать. Но если вы не используете провайдера JPA для генерации модели и если PK может быть сгенерирован базой данных (с использованием столбца IDENTITY, триггера и т. Д.), То вы сможете использовать таблицу C для вашей ManyToMany ассоциации (без необходимости введения дополнительной сущности и преобразования отношения в два OneToMany). Вы на самом деле пытались?

1 голос
/ 21 сентября 2010

Я не думаю, что это возможно.И я не вижу проблемы в определении сущности C.

Если у вас есть какая-либо дополнительная информация, такая как таблица соединений, она не будет вам доступна, потому что ваша Set содержит цельсущность - A или B.

Кроме того, ваши Set s будут лучше использовать дженерики - например, Set<A> и Set<B>.

Кстати, Hibernate не можетбудьте встревожены тем фактом, что таблица создает другую сущность - использование текущего сопоставления может сработать (без учета столбца id).Когда вы сказали «Hibernate создает», я предположил, что вы генерируете свою схему из вашей модели сущностей.Теперь кажется, что все наоборот, так что попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...