Hibernate несколько запросов выполняются для отношения многие к одному - PullRequest
0 голосов
/ 26 апреля 2018

Мы сталкиваемся с какой-то странной проблемой при рассмотрении отношений один ко многим.Для более подробного описания у нас есть следующие сущности:

RCAAssessmentUnit: -

@Entity
@Table(name = "RCAAssessmentUnit")
@Access(AccessType.FIELD)
public class RCAAssessmentUnit extends AbstractPersistentEntity implements Serializable {

    private static final long serialVersionUID = -3114793801627752533L;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "document", nullable = true)
    protected Document document;

    @Column(name = "Name", length = 150, nullable = false)
    protected String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "rca_assessment_unit_admin", nullable = true)
    @NotFound(action = NotFoundAction.IGNORE)
    protected RCAAssessmentUnitAdmin rcaAssessmentUnitAdmin;

RCAAssessmentUnitAdmin -

@Entity
@Table(name = "RCAAssessmentUnitAdmin")
@Access(AccessType.FIELD)
public class RCAAssessmentUnitAdmin extends AbstractPersistentEntity implements Serializable {

    private static final long serialVersionUID = 8890257035008399346L;

    // Name
    @Column(name = "Name", length = 150, nullable = false)
    protected String name;

    @Column(name = "changed$")
    protected Date changed;

    @OneToMany(mappedBy = "rcaAssessmentUnitAdmin", fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    protected List<RCAAssessmentUnit> rcaAssessmentUnits;

BCDocument, расширяющий Document и поддерживающий стратегию присоединения к наследованию.

@Entity
@PrimaryKeyJoinColumn(name = "Document")
@Table(name = "BCDocument")
@Access(AccessType.FIELD)
public class BCDocument extends Document 
------
   @OneToMany(mappedBy = "document", fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE}, orphanRemoval = true)
    @OrderBy(value = "name")
    private List<RCAAssessmentUnit> rcaAssessmentUnits ;

Документ: -

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "Document", uniqueConstraints = { @UniqueConstraint(columnNames = { "Id" }) })
@Access(AccessType.FIELD)
public class Document extends AbstractPersistentEntity {

Итак, с этими отношениями у нас есть модуль администратора для добавления / удаления / редактирования 'RCAAssessmentUnitAdmin'.Сначала на главной странице перечисляются все администраторы, и как только мы пытаемся отредактировать любого администратора, который добавлен в любые BCDcouments из журнала запросов, мы можем видеть, что несколько запросов выбираются для загрузки всех документов, которые расширяют сущность «Документ», напримерAWT, CTT и т. Д. Вместе с BCDocument, например,

Hibernate: select rcaassessm0_.rca_assessment_unit_admin as ------ from RCAAssessmentUnit rcaassessm0_ where rcaassessm0_.rca_assessment_unit_admin in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: select document0_.Id$ as Id1_48_0_, -----
from Document document0_ left outer join AWT document0_1_ on document0_.Id$=document0_1_.Document left outer join CTT document0_2_ on document0_.Id$=document0_2_.Document left outer join WCR document0_3_ on document0_.Id$=document0_3_.Document left outer join BRST document0_4_ on document0_.Id$=document0_4_.Document left outer join BCDocument document0_5_ on document0_.Id$=document0_5_.Document left outer join Impact_Analysis_RTO impactanal1_ on document0_.Impact_Analysis_Rto=impactanal1_.Id$ where document0_.Id$ in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Итак, самая первая операция (перечисление всех администраторов) сохраняет все отношения «ленивыми», но как только мы пытаемся редактировать «admin», почемупытается выполнить запрос к иерархии «Документ» (как видно из второго запроса)?Нам не нужны отношения документа или дочерние объекты «admin» при редактировании.Также, если 'admin' удален, мы помечаем ссылку всех дочерних элементов (RCAAssessmentUnit) на null, поскольку мы не хотим удалять дочерние элементы, которые уже добавлены в BCDocument.

Я читал все связанныеВопросы и ответы по этому вопросу, а также проверил проблему N + 1, но пока не смог выяснить проблему здесь.Любые предложения будут высоко оценены.

Обновлено: Ниже приведен блок кода, который выбирает список администраторов.Оба эти метода являются частью базового компонента, который является компонентом шва с областью действия сеанса.

  public void retrieve() {
        TypedQuery<RCAAssessmentUnitAdmin> query = entityManager.createQuery("from RCAAssessmentUnitAdmin order by name", RCAAssessmentUnitAdmin.class);
        rcaAssessmentUnitItems = query.getResultList();
    }

И у нас есть таблица данных Richfaces, которая связывает этот список, и при действии редактирования вызов обрабатывается ниже.Таким образом, даже до того, как элемент управления войдет в этот метод редактирования, в бэкэнд-консоли я мог видеть выполнение всех запросов.

public void edit(RCAAssessmentUnitAdmin unitAdmin) {
    log.info("edit: " + unitAdmin);
RCAAssessmentUnitAdminScreen dialog = Util.getSeamComponent (RCAAssessmentUnitAdminScreen.class, true);
    dialog.setupDialog(unitAdmin, rcaAssessmentUnitItems);

}

    <rich:dataTable id="items" style="word-break: keep-all;" value="#{rcaAssessmentUnitItems}" var="row" rowKeyVar="rowKey" columnClasses="col" rowClasses="odd_row, even_row">
                        <f:facet name="footer">
                            <h:outputText value="No RCA Assessment Units Found" rendered="rcaAssessmentUnitItems == null or rcaAssessmentUnitItems.size == 0}"/>
                        </f:facet>
                        <rich:column style="text-align: center; width: 70px;">
                            <f:facet name="header"><h:outputText value="#" /></f:facet>
                        <div style="width:45px !important;margin: 0 auto !important;">
                            <a:commandButton execute="@this"  action="#{updateRCAAssessmentUnits.edit(row)}" styleClass="listItemBtn" value="#{rowKey + 1}"/>
                        </div>
                    </rich:column>
-----
</rich:dataTable>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...