Hibernate @ManyToMany сопоставление с составными ключами - PullRequest
1 голос
/ 13 октября 2008

Я пытаюсь отобразить отношения ManyToMany между двумя таблицами, обе из которых имеют составные первичные ключи

LSFOCTB which primary key is composed of : LSFOC_CODSOC,LSFOC_CODLSC,LSFOC_CODFOC

LSFORTB which primary key is composed of : LSFOR_CODSOC,LSFOR_CODLSC,LSFOC_CODFOR

The table in charge of the ManyToMany relationship is :

LSFCFTB, with : LSFCF_CODSOC,LSFCF_CODLSC,LSFCF_CODFOC,LSFCF_CODFOR

Итак, в отображении модели гибернации LSFOCTB я попытался:

@ManyToMany(targetEntity = package.LSFOCTB.class, cascade = { CascadeType.PERSIST,
            CascadeType.MERGE })
    @JoinTable(name = "LSFCFTB", joinColumns = {
            @JoinColumn(name = "LSFCF_CODLSC", referencedColumnName = "LSFOC_CODLSC"),
            @JoinColumn(name = "LSFCF_CODFOC", referencedColumnName = "LSFOC_CODFOC"),
            @JoinColumn(name = "LSFCF_CODSOC", referencedColumnName = "LSFOC_CODSOC") }, 
    inverseJoinColumns = { @JoinColumn(name = "LSFCF_CODLSC", referencedColumnName = "LSFOR_CODLSC"),
            @JoinColumn(name = "LSFCF_CODFOR", referencedColumnName = "LSFOR_CODFOR"),
            @JoinColumn(name = "LSFCF_CODSOC", referencedColumnName = "LSFOR_CODSOC") })

перед добытчиком. Но это не сработает ... Ошибка при попытке доступа к удаленной коллекции:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [beans-dao.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Repeated column in mapping for collection: package.LSFOCTB.distantCollection column: LSFCF_CODLSC

Уже удалось заставить работать отображение спящего режима для отношений ManyToMany? Если так, что не так с моим отображением? Спасибо за вашу помощь!

1 Ответ

1 голос
/ 13 октября 2008

Кажется, проблема в том, что вы создаете объединяющую таблицу с 6 столбцами, и для ваших столбцов есть повторяющиеся имена. Вы фактически создаете 2 столбца с именем LSFCF_CODLSC и 2 столбца с именем LSFCF_CODFOR и 2 столбца с именем LSFCF_CODSOC .

Я бы посоветовал вам попробовать это:

@JoinTable(name = "LSFCFTB", joinColumns = {
                    @JoinColumn(name = "LSFOC_LSFCF_CODLSC", referencedColumnName = "LSFOC_CODLSC"),
                    @JoinColumn(name = "LSFOC_LSFCF_CODFOC", referencedColumnName = "LSFOC_CODFOC"),
                    @JoinColumn(name = "LSFOC_LSFCF_CODSOC", referencedColumnName = "LSFOC_CODSOC") }, 
        inverseJoinColumns = { @JoinColumn(name = "LSFOR_LSFCF_CODLSC", referencedColumnName = "LSFOR_CODLSC"),
                    @JoinColumn(name = "LSFOR_LSFCF_CODFOR", referencedColumnName = "LSFOR_CODFOR"),
                    @JoinColumn(name = "LSFOR_LSFCF_CODSOC", referencedColumnName = "LSFOR_CODSOC") })

или что-то подобное (в соответствии с вашим соглашением об именах), чтобы дать каждому столбцу уникальное имя.

...