Hibernate上的映射问题



我正在开发JHipster项目,由于我认为是映射问题,我已经停止了

我的数据库有几个表,但在这里影响我的两个表是研究和出版,它们有多对多的关系。

我需要检索可以发布研究的出版物集合,因此study是关系的所有者,但出于某种原因,Hibernate无法识别我映射关系的属性。

所有这些都开始试图解决一个懒惰的连接问题,是的,我已经浏览了大多数与此相关的帖子,我已经尝试了所有对我有意义的东西。

这里的研究代码:

@Audited
@Entity
@Table(name = "Study")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Document(indexName = "study")
public class Study implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(name = "num_sites")
    private Integer numSites;
    @Column(name = "ref")
    private String ref;
    @Column(name = "study_type")
    private String studyType;
    @ManyToMany(fetch = FetchType.LAZY)
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "Pub_Study",
               joinColumns = @JoinColumn(name="studies_id", referencedColumnName="id"),
               inverseJoinColumns = @JoinColumn(name="publications_id", referencedColumnName="id"))
    public static Set<Publication> publications = new HashSet<>();
    @OneToMany(mappedBy = "study")
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<SiteData> siteDatas = new HashSet<>();
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public Integer getNumSites() {
        return numSites;
    }
    public void setNumSites(Integer numSites) {
        this.numSites = numSites;
    }
    public String getRef() {
        return ref;
    }
    public void setRef(String ref) {
        this.ref = ref;
    }
    public String getStudyType() {
        return studyType;
    }
    public void setStudyType(String studyType) {
        this.studyType = studyType;
    }
    public static Set<Publication> getPublicationss() {
        return publications;
    }
    public void setPublicationss(Set<Publication> publications) {
        this.publications = publications;
    }
    public Set<SiteData> getSiteDatas() {
        return siteDatas;
    }
    public void setSiteDatas(Set<SiteData> siteDatas) {
        this.siteDatas = siteDatas;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Study study = (Study) o;
        if(study.id == null || id == null) {
            return false;
        }
        return Objects.equals(id, study.id);
    }
    @Override
    public int hashCode() {
        return Objects.hashCode(id);
    }
    @Override
    public String toString() {
        return "Study{" +
            "id=" + id +
            ", numSites='" + numSites + "'" +
            ", ref='" + ref + "'" +
            ", studyType='" + studyType + "'" +
            '}';
    }

这里的出版代码:

@Audited
@Entity
@Table(name = "Publication")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Document(indexName = "publication")
public class Publication implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(name = "authors")
    private String authors;
    @Column(name = "first_author")
    private String firstAuthor;
    @Column(name = "journal")
    private String journal;
    @Column(name = "pubMedId")
    private Integer pubMedId;
    @Column(name = "title")
    private String title;
    @Column(name = "year_publish")
    private Integer yearPublish;
    @Version
    Integer version;
    @ManyToMany(fetch = FetchType.LAZY)
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Study> studies = new HashSet<>();
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getAuthors() {
        return authors;
    }
    public void setAuthors(String authors) {
        this.authors = authors;
    }
    public String getFirstAuthor() {
        return firstAuthor;
    }
    public void setFirstAuthor(String firstAuthor) {
        this.firstAuthor = firstAuthor;
    }
    public String getJournal() {
        return journal;
    }
    public void setJournal(String journal) {
        this.journal = journal;
    }
    public Integer getPubMedId() {
        return pubMedId;
    }
    public void setPubMedId(Integer pubMedId) {
        this.pubMedId = pubMedId;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public Integer getYearPublish() {
        return yearPublish;
    }
    public void setYearPublish(Integer yearPublish) {
        this.yearPublish = yearPublish;
    }
    public Set<Study> getStudies() {
        return studies;
    }
    public void setStudies(Set<Study> studys) {
        this.studies = studys;
    }
    public Integer getVersion(){
        return version;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Publication publication = (Publication) o;
        if(publication.id == null || id == null) {
            return false;
        }
        return Objects.equals(id, publication.id);
    }
    @Override
    public int hashCode() {
        return Objects.hashCode(id);
    }
    @Override
    public String toString() {
        return "Publication{" +
            "id=" + id +
            ", authors='" + authors + "'" +
            ", firstAuthor='" + firstAuthor + "'" +
            ", journal='" + journal + "'" +
            ", pubMedId='" + pubMedId + "'" +
            ", title='" + title + "'" +
            ", yearPublish='" + yearPublish + "'" +
            '}';
    }
}

这里的查询实现从存储库包:

public class SiteDataRepositoryImpl implements SiteDataRepositoryCustom{
    @PersistenceContext
    private EntityManager em;
    @Override
    public List <SiteDataViewDTO> searchSiteDataByFilter(List<Filter> listFilters) {
        TypedQuery<SiteData> query = buildQuery(listFilters);
        Hibernate.initialize(Study.publications);
        int count=0;
        for (Filter filter: listFilters){
            if("country".equals(filter.getName()))
                query.setParameter(filter.getName(), filter.getQuery());
            else if("category".equals(filter.getName()))
                query.setParameter(filter.getName(), filter.getQuery());
            else if("studyRef".equals(filter.getName()))
                query.setParameter(filter.getName(), filter.getQuery());
            else if("studyType".equals(filter.getName()))
                query.setParameter(filter.getName(), filter.getQuery());
            else if("pubMedId".equals(filter.getName()))
                query.setParameter(filter.getName(), Integer.valueOf(filter.getQuery()));
            count++;
        }
        List<SiteData> siteDataList = query.getResultList();
        List<SiteDataViewDTO> siteDataViewDTOList=new ArrayList<SiteDataViewDTO>();
        //temp variables
        List<String>tempListTreatments = new ArrayList<String>();
        List<String>tempListTitles = new ArrayList<String>();
        List<Integer>tempListIdMed = new ArrayList<Integer>();
        //filling SiteDataViewDTO list
        siteDataList.stream().forEach(sd->{
             SiteDataViewDTO temp = new SiteDataViewDTO();
             temp.setTypeStudy(sd.getTypeStudy() + "id SiteData: " + sd.getId());
             temp.setRef(sd.getStudy().getRef());
             temp.setCategory(sd.getCategory().getName());
             temp.setUpper95CI(sd.getUpper95CI());
             temp.setYearStart(sd.getYearStart());
             temp.setYearEnd(sd.getYearEnd());
             Set<Publication>setPu = sd.getStudy().getPublicationss();
             System.out.println("@@@@@@@@@@@@@@@@@@@@ In the query, size of the Publications List "+setPu.size());
                setPu.stream().forEach(sp-> {
                    tempListTitles.add(sp.getTitle());
                    tempListIdMed.add(sp.getPubMedId());
                });
                Set<Treatment>setTr = sd.getTreatments();
                /*setTr.stream().forEach(sp-> {
                    tempListTreatments.add(sp.getTreatmentName());
             });*/
             temp.setListPubObject(setPu);
             temp.setListTreatObject(setTr);
             siteDataViewDTOList.add(temp);
        });
        return siteDataViewDTOList;
    }
    private TypedQuery<SiteData> buildQuery(List<Filter> listFilters){
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<SiteData> cq = cb.createQuery(SiteData.class);
        Root<SiteData> siteData = cq.from(SiteData.class);
        Join<SiteData, Category> cat = siteData.join("category", JoinType.LEFT);
        Join<SiteData, Location> loc = siteData.join("location",JoinType.LEFT);
        Join<SiteData, Treatment> tre = siteData.join("treatments",JoinType.LEFT);
        Join<SiteData, Study> stu = siteData.join("study",JoinType.LEFT);
        Join<Study, Publication> pub = stu.join("publications",JoinType.LEFT);
        List<Predicate> predicates = new ArrayList<>();
        int index = 0;
        for(Filter filter : listFilters){
            if("country".equals(filter.getName()))
                predicates.add(cb.equal(loc.get("country"), cb.parameter(String.class, filter.getName())));
            else if("category".equals(filter.getName()))
                predicates.add(cb.equal(cat.get("name"), cb.parameter(String.class, filter.getName())));
            else if("studyRef".equals(filter.getName()))
                predicates.add(cb.equal(stu.get("ref"), cb.parameter(String.class, filter.getName())));
            else if("studyType".equals(filter.getName()))
                predicates.add(cb.equal(stu.get("studyType"), cb.parameter(String.class, filter.getName())));
            else if("pubMedId".equals(filter.getName()))
                predicates.add(cb.equal(pub.get("pubMedId"), cb.parameter(Integer.class, filter.getName())));
            index++;
        }
        cq.where(cb.and(predicates.toArray(new Predicate[0])));
        return em.createQuery(cq);
    }
}   

所以,如果有人能对此有所了解,那将是非常有帮助的!

I编辑以添加它抛出的主要异常:

Caused by: org.hibernate.QueryException: could not resolve property: publications of: org.wwarn.vivax.manager.domain.Study
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77)
    at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1978)
    at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:367)

您的实体定义中有一个拼写错误:"publications"而不是"publishings"。由于Hibernate使用JavaBeans属性进行数据访问,它会抱怨定义中的getPublications()丢失。

元模型可以避免此类拼写错误,请考虑使用它。

最新更新