2016-04-15 7 views
0

Ich bin in der Mitte ein JHipster Projekt zu entwickeln, und ich habe zum Stillstand kommen wegen dem, was ich glaube, Mapping zu sein gibtMapping Problem auf Hibernate

Meine Datenbank mehrere Tabellen hat, aber die beiden, die mich beeinflussen Hier sind Studie und Veröffentlichung, wo sie eine Viele-zu-Viele-Beziehung haben.

Ich muss die Sammlung von Publikationen abrufen, in denen eine Studie veröffentlicht werden kann, daher ist Study der Eigentümer der Beziehung, aber aus irgendeinem Grund erkennt Hibernate die Attribute nicht, mit denen ich die Beziehung abbilde.

All dies begann ein faules Verbindungsproblem zu lösen versuchen, ja, ich habe im Zusammenhang dies die meisten Beiträgen durchgemacht und ich habe alles versucht, den Sinn für mich gemacht.

Hier ist der Code der Studie:

@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 + "'" + 
      '}'; 
    } 

Hier ist der Code der Veröffentlichung:

@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 + "'" + 
      '}'; 
    } 
} 

Hier ist die Implementierung der Abfrage aus dem Repository-Paket:

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); 
    } 
} 

So, Wenn jemand etwas Licht darauf werfen könnte, wäre es sehr hilfreich!

ich bearbeiten die Haupt Ausnahme hinzufügen wirft:

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) 
+0

Da Sie die Kriterien-API verwenden, sollten Sie das Metamodell anstelle von einfachen Zeichenfolgen für die Abfrage von Eigenschaften verwenden. Die Kriterien-API ist ohne Metamodell kaum sinnvoll und kann ohne besonderen Verlust durch JPQL ersetzt werden. –

Antwort

0

Sie haben einen Tippfehler in Ihrer Entitätsdefinition: „publicationss“ statt „Publikationen“. Da Hibernate JavaBeans-Eigenschaften für den Datenzugriff verwendet, klagt es über den Verlust von getPublications() in Ihrer Definition.

Metamodel bewahrt Sie von einem solchen Fehler, betrachten Sie es.

+0

Hallo, danke für deine Antwort, ich konnte endlich herausfinden, wo das Problem lag, es gab mir eine faule Inizialisierung, weil ich in der Abfrage keinen Abruf hatte, alles was ich brauchte war: siteData.fetch (" Studie "). holen (" Veröffentlichungen "); am Ende des Querybuilder Die getPublicationss ist, wie es kommt, wenn ich die Entitäten erstellen, fragen Sie mich nicht, warum> – Steven

+0

By the way, werde ich von nun an mit Metamodell betrachten;) – Steven