Hibernate上的映射问题

时间:2016-04-15 13:39:12

标签: java hibernate jpa mapping jhipster

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

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

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

所有这一切都开始尝试解决一个懒惰的连接问题,是的,我已经完成了与此相关的大多数帖子,并且我已经尝试了对我有意义的一切。

这里的研究代码:

Array ( [0] => 4 [1] => 5 [2] => 3 [3] => 2 [4] => 1 [5] => 0 ) 
Comma Seperated String : 4,5,3,2,1,0

这里是出版物代码:

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

这里是Repository包中查询的实现:

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

1 个答案:

答案 0 :(得分:0)

您的实体定义中有一个拼写错误:&#34; publicationss&#34;而不是&#34;出版物&#34;。由于Hibernate使用JavaBeans属性进行数据访问,因此它会在定义中抱怨getPublications()丢失。

Metamodel会保留您的拼写错误,请考虑使用它。