Двунаправленные отношения Hibernate ManyToMany не извлекают родительские объекты в дочерних - PullRequest
0 голосов
/ 26 мая 2020

У меня есть приложение, в котором есть проекты, связанные с несколькими текстовыми объектами, а текстовые объекты связаны с несколькими проектами (многие-ко-многим). Теперь, когда я пытаюсь получить текстовые объекты в спящем режиме, я получаю projects = null

Вот сторона проекта отношения:

import lombok.Data;

import javax.persistence.*;
import java.util.List;

@Data
@Entity
@Table(name = "project_data")
public class Project {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name="project_id")
    private int projectId;
    @Column(name="project_name")
    private String projectName;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name="project_text", joinColumns = {@JoinColumn(name = "project_id")}, inverseJoinColumns = {@JoinColumn(name="text_id")})
    private List<Text> texts;

    public Project(String projectName){
        this.projectName = projectName;
    }
}

Вот Текстовая сторона отношения:

import lombok.Data;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.util.List;

@Data
@Entity
@Table(name="text_data")
public class Text {

    @Id
    @GeneratedValue(generator = "text_hash")
    @GenericGenerator(name = "text_hash",strategy = "TextHashGenerator")
    @Column(name="text_id")
    private String text_id;
    @Column(name="text_value")
    private String text;

    @ManyToMany(cascade = CascadeType.ALL, mappedBy = "texts", fetch = FetchType.LAZY)
    private List<Project> projects;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name="text_keyword", joinColumns = {@JoinColumn(name = "text_id")}, inverseJoinColumns = {@JoinColumn(name = "keyword_id")})
    private List<Keyword> keywords;

    public Text(String text){
        this.text = text;
    }
}


Вот пользовательский TextHashGenerator, который я использую для генерации идентификатора для текстовых сущностей

import org.apache.commons.codec.digest.DigestUtils;
import org.hibernate.HibernateException;

import org.hibernate.engine.spi.SharedSessionContractImplementor;

import org.hibernate.id.IdentifierGenerator;


import java.io.Serializable;

public class TextHashGenerator implements IdentifierGenerator{
    @Override
    public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException {
        String textHash = "";
        if(o instanceof Text){
            Text text = (Text) o;
            textHash = DigestUtils.sha256Hex(text.getText());
        }
        return textHash;
    }
}

эта проблема относится ко всем отношениям, так как они не могут получить сторону отношения владельца.

Вывод

Text(text_id=21e57b707ffe2bd2d89b2b6f6c999597dc6e9dd90eaee809fbd06c222cf54de8, text=Text 1, projects=null, keywords=[Keyword(keywordId=2, keyword=Text 1 Keyword 1, texts=null, meanings=[Meaning(meaningId=3, meaning=Text 1 Keyword 1 meaning 1, keyword=null), Meaning(meaningId=4, meaning=Text 1 Keyword 1 meaning 2, keyword=null), Meaning(meaningId=5, meaning=Text 1 Keyword 2 meaning 1, keyword=null)]), Keyword(keywordId=6, keyword=Text 1 Keyword 2, texts=null, meanings=null), Keyword(keywordId=7, keyword=Text 2 Keyword 1, texts=null, meanings=null), Keyword(keywordId=8, keyword=Text 2 Keyword 2, texts=null, meanings=null)])

Я использую следующий запрос для получения текста

Query query = session.createQuery("from Text");

1 Ответ

0 голосов
/ 26 мая 2020

Вы должны присоединиться к отношениям, если вы установите fetch = FetchType.LAZY (что вы должны, не меняйте это). Сделайте это так:

Query query = session.createQuery("SELECT t from Text t JOIN t.projects")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...