Как сопоставить отношения «многие ко многим» между двумя представлениями? - PullRequest
1 голос
/ 06 мая 2019

По сути, у меня есть поиск, который использует большое представление SQL для извлечения данных, и теперь мне нужно расширить функциональность поиска для другого поля, взятого из отдельного представления.

Я выполнил шаги, описанные в этом ссылка , но я застрял.

Я хочу создать отношение многие ко многим между представлениями V_FPDA_FILE_RTL_UNT и V_FPDA_FILE_UK_CONTN.

У меня есть таблица FpdaFileDetail, сопоставленная с представлением V_FPDA_FILE_RTL_UNT.

@Entity(name="FpdaFileDetail")
@Table(name="V_FPDA_FILE_RTL_UNT")
@AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "FPDA_FILE_ID")) })
public class FpdaFileDetail {

...

@ManyToMany
    @Fetch(FetchMode.SUBSELECT)
    @JoinTable(name = "V_FPDA_FILE_UK_CONTN", joinColumns = { @JoinColumn(name = "FPDA_FILE_ID") }, inverseJoinColumns = {@JoinColumn(name = "UK_CMPT_CONTN_ID")})
    public Set<UkComponentContent> getUkContentIds() {
        return ukContentIds;
    }

    public void setUkContentIds(Set<UkComponentContent> ukContentIds) {
        this.ukContentIds = ukContentIds;

}

Созданная мной связь «многие ко многим» сделана так:

@Entity
@Table(name="UK_CONTN")
@AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "UK_CONTN_ID")) })
public class UkContent {

    private static final long serialVersionUID = 1L;
    private String contentId;
    private Set<UkComponentContent> ukComponentContents;


    @Column(name = "UK_CONTN")
    public String getContentId() {
        return contentId;
    }

    public void setContentId(String contentId) {
        this.contentId = contentId;
    }

    @OneToMany(
            mappedBy = "ukContent",
            cascade = CascadeType.ALL,
            orphanRemoval = true
        )
    public Set<UkComponentContent> getUkComponentContents() {
        return ukComponentContents;
    }

    public void setUkComponentContents(Set<UkComponentContent> ukComponentContents) {
        this.ukComponentContents = ukComponentContents;
    }

}
@Entity(name = "FpdaFile")
@Table(name = "FPDA_FILE")
@AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "FPDA_FILE_ID")) })
public class FpdaFile {
...
    private Set<UkComponentContent> ukContentIds = new HashSet<UkComponentContent>(0);

        @OneToMany(mappedBy = "fpdaFile")
    public Set<UkComponentContent> getUkContentIds() {
        return ukContentIds;
    }

    public void setUkContentIds(Set<UkComponentContent> ukContentIds) {
        this.ukContentIds = ukContentIds;
    }

}
@Entity
@Table(name="UK_CMPT_CONTN")
@AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "UK_CMPT_CONTN_ID")) })
public class UkComponentContent extends BaseEntity {
    private FpdaFile fpdaFile;
    private UkContent ukContent;

    @ManyToOne
    @JoinColumn(name = "FPDA_FILE_ID")
    public FpdaFile getFpdaFile() {
        return fpdaFile;
    }

    public void setFpdaFile(FpdaFile fpdaFile) {
        this.fpdaFile = fpdaFile;
    }

    @ManyToOne
    @JoinColumn(name = "UK_CONTN_ID")
    public UkContent getUkContent() {
        return ukContent;
    }
    public void setUkContent(UkContent ukContent) {
        this.ukContent = ukContent;
    }


}

Дело в том, что если я разрешу код, подобный этому, поиск не будет работать, но он не выдаст никакой ошибки.После отладки я понял, что если я прокомментирую это (из FpdaFileDetail) ..

@ManyToMany
    @Fetch(FetchMode.SUBSELECT)
    @JoinTable(name = "V_FPDA_FILE_UK_CONTN", joinColumns = { @JoinColumn(name = "FPDA_FILE_ID") }, inverseJoinColumns = {@JoinColumn(name = "UK_CMPT_CONTN_ID")})
    public Set<UkComponentContent> getUkContentIds() {
        return ukContentIds;
    }

    public void setUkContentIds(Set<UkComponentContent> ukContentIds) {
        this.ukContentIds = ukContentIds;

, поиск будет работать.Но без комментариев он не работает.

Любая идея приветствуется!

...