JPA EntityManager Создать собственный запрос не возвращает данные внешнего ключа - PullRequest
0 голосов
/ 19 июня 2019

У меня есть две сущности, TableA и TableB, с отображением «многие ко многим» между ними.Когда я пытаюсь выбрать все table_b с помощью createNativeQuery, я могу получить все данные table_b, но не могу ссылаться ни на какие данные table_a.

table_a entity

@Entity
@Table(name = "table_a")
public class TableA implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "data1")
    private String data1;

    @Column(name = "data2")
    private String data2;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(
            name = "a_b_mapping",
            joinColumns = @JoinColumn(name = "a_id"),
            inverseJoinColumns = @JoinColumn(name = "b_id"))
    private List<TableB> bItems;

    // getters/setters
    public List<TableB> getBItems() {
        if (bItems == null) { bItems = new ArrayList<>(); }

        return bItems;
    }

    public void setBItems(List<TableB> bItems) {
        this.bItems = bItems;
    }
}

table_bсущность

@Entity
@Table(name = "table_b")
public class TableB implements Serializable { 

    @Id
    @Column(name = "id")
    private Integer id;

    @ManyToMany(mappedBy = "bItems")
    private List<TableA> aItems;

    // Getters/Setters

    public List<TableA> getAItems() {
        if (aItems == null) { aItems = new ArrayList<>(); }

        return aItems;
    }

    public void setAItems(List<TableA> aItems) {
        this.aItems = aItems;
    }

}

ПРИМЕЧАНИЕ. Я устанавливаю идентификатор вручную для TableB перед вставкой

Процессор:

@Component
public class ProcessorDAO {

    @PersistenceUnit
    private EntityManagerFactory entityManagerFactory;

    @Transactional
    public void process() {

        EntityManager em = entityManagerFactory.createEntityManager();
        EntityTransaction entityTransaction = em.getTransaction();

        try {
            entityTransaction.begin();

            Query q = em.createNativeQuery("SELECT * FROM table_b", TableB.class);
            List<TableB> tableBItems = q.getResultList();

            for (TableB item : tableBItems) {
                // Always 0 here?
                item.getAItems().size();
            }

            entityTransaction.commit();
        } catch (RuntimeException e) {
            if (entityTransaction.isActive()) {
                entityTransaction.rollback();
            }
            throw e;
        } finally {
            em.close();
        }
    }
}

Я могу получить AItems, если используюfindAll из репозитория TableB, но я пытался заставить это работать только с менеджером сущностей, не зная, в чем разница.

1 Ответ

0 голосов
/ 20 июня 2019

В вашем случае внешний ключ фактически находится в Таблице A, выбирая только таблицу B, получить связь невозможно. Вам нужно присоединиться к таблице A в нативном sql. Выберите * из таблицы B Присоединиться к столу А .....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...