Связывание (маппинг) сущности в системе с таблицей на SQL-сервере

Нужно получать данные контрагентах. Для примера, таблица SQL содержит ID, Name, INN.
Почитав что-то из документации и форума для себя составил следующий алгоритм:

  • В свойствах проекта указываю Additional Data Store;
  • Создаю Not Persistent сущность. Указываю тип идентификатора Integer. UUID можно убрать, правильно я понимаю?
  • Теперь мне необходимо определить DataSource (DataManager?). Правильно я понимаю, что делать это нужно в контроллере UI экрана? Поделитесь, пожалуйста, примером.

Правильно, изначально подключаете Additional Data Store.
Дальше смотря как вы хотите выполнять запросы.

  • Средствами ORM подсистемы

В данном случае удобнее воспользоваться кнопкой “Generate model” в Studio на вкладке “Data model”. Выбираете нужное хранилище (в данном случае только что добавленное) и далее все описано в встроенной в студию справке.

В документации есть подробное описание с примерами тут и тут.
Примерный запрос на JPQL в вашем случае (заменить application$Contragent на Name сгенерированной сущности)

entityManager.createQuery(“select cn from application$Contragent cn”)

  • Нативным SQL

В данном случае не нужно создавать никаких сущностей. Используя обычный sql язык пишете запрос, как бы вы писали в клиенте СУБД. Документация тут. Пример запроса:

entityManager.createNativeQuery(“select * from Contragent”)


В общем случае удобнее использовать первый вариант, т.к. не нужно вручную вставлять/удалять/изменять данные. Платформа сделает все за вас. Второй же вариант удобно использовать в редких специфичных запросах. Но тут уже кому как нравится

2 симпатии

Спасибо, Алексей.

  • Создал Сущность1 через Generate Model.
  • В Сущности2 создал ассоциацию многие-к-одному на “внешнюю” Сущность1.
  • При создании экземпляра Сущность2 все отрабатывает хорошо.
  • При изменении же экземпляра Сущность2 получаю следующую ошибку:
    “IllegalStateException: No active transaction for testDStore database”
Подробно

java.lang.IllegalStateException: No active transaction for testDStore database
at com.haulmont.cuba.core.sys.PersistenceImpl.getEntityManager(PersistenceImpl.java:166)
at com.haulmont.cuba.core.sys.EntityFetcher.fetch(EntityFetcher.java:146)
at com.haulmont.cuba.core.sys.EntityFetcher.fetch(EntityFetcher.java:65)
at com.haulmont.cuba.core.app.RdbmsStore.commit(RdbmsStore.java:357)
at com.haulmont.cuba.core.app.DataManagerBean.commit(DataManagerBean.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.haulmont.cuba.core.app.DataManagerBean$SecureDataManagerInvocationHandler.invoke(DataManagerBean.java:362)
at com.sun.proxy.$Proxy307.commit(Unknown Source)
at com.haulmont.cuba.core.app.DataServiceBean.commit(DataServiceBean.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:117)
at sun.reflect.GeneratedMethodAccessor109.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy230.commit(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94)
at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:148)
at com.sun.proxy.$Proxy28.commit(Unknown Source)
at com.haulmont.cuba.client.sys.DataManagerClientImpl.commit(DataManagerClientImpl.java:96)
at com.haulmont.cuba.gui.data.impl.GenericDataSupplier.commit(GenericDataSupplier.java:90)
at com.haulmont.cuba.gui.data.impl.DsContextImpl.commit(DsContextImpl.java:166)
at com.haulmont.cuba.gui.components.EditorWindowDelegate.commit(EditorWindowDelegate.java:281)
at com.haulmont.cuba.web.gui.WebWindow$Editor.commitAndClose(WebWindow.java:1739)
at com.haulmont.cuba.gui.components.AbstractEditor.commitAndClose(AbstractEditor.java:109)
at com.haulmont.cuba.gui.components.EditorWindowDelegate$2.actionPerform(EditorWindowDelegate.java:101)
at com.haulmont.cuba.web.gui.components.WebButton.performAction(WebButton.java:44)
at com.haulmont.cuba.web.gui.components.WebButton.lambda$new$61446b05$1(WebButton.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163)
at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1037)
at com.vaadin.ui.Button.fireClick(Button.java:377)
at com.haulmont.cuba.web.toolkit.ui.CubaButton.fireClick(CubaButton.java:54)
at com.vaadin.ui.Button$1.click(Button.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:119)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:444)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:409)
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274)
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1436)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361)
at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:301)
at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:192)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.haulmont.cuba.web.sys.CubaHttpFilter.handleNotFiltered(CubaHttpFilter.java:108)
at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:95)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

К сожалению тут я Вам не помощник, потому что я жду ответа по аналогичной теме)
Ошибка экрана редактирования

““IllegalStateException: No active transaction for XYZ database” - проблема исправлена в версии 6.7.4, сегодня или завтра будет доступна для загрузки.

1 симпатия

@krivopustov , большое спасибо за фикс - работает.

Но судя по всему не все проблемы с “внешними сущностями” решены.
Имею:

  • Сущность1 - внешняя, создана через Generate Model.
  • Сущность2 - персистентная имеет ассоциацию к Сущности1 в отношении многие-к-одному.
  • Сущность3 - персистентная имеет ассоциацию к Сущности2 в отношении многие-ко-многим.

Задача: отображать в таблице Сущности3 значения некоторых атрибутов Сущности1, связанных с выбранными в таблице Сущностями2. Во view эти атрибуты включены. Это можно наблюдать на скриншоте, заполненные атрибуты Type и Param1.
image

Но при добавлении в таблицу Сущности2, я получаю ошибку: “llegalStateException: Cannot get unfetched attribute [unit] from detached object com.company.wellsequpmentdb.entity”.PartNumber-4ebf9447-2bc8-40e5-91cf-ec57f69efe5e [detached].

Подробно java.lang.IllegalStateException: Cannot get unfetched attribute [unit] from detached object com.company.wellsequpmentdb.entity.PartNumber-4ebf9447-2bc8-40e5-91cf-ec57f69efe5e [detached]. at org.eclipse.persistence.internal.queries.EntityFetchGroup.onUnfetchedAttribute(EntityFetchGroup.java:98) at com.haulmont.cuba.core.sys.persistence.CubaEntityFetchGroup.onUnfetchedAttribute(CubaEntityFetchGroup.java:61) at org.eclipse.persistence.internal.jpa.EntityManagerImpl.processUnfetchedAttribute(EntityManagerImpl.java:2846) at com.haulmont.chile.core.model.impl.AbstractInstance._persistence_checkFetched(AbstractInstance.java) at com.company.wellsequpmentdb.entity.PartNumber._persistence_get_unit(PartNumber.java) at com.company.wellsequpmentdb.entity.PartNumber.getUnit(PartNumber.java:142) at sun.reflect.GeneratedMethodAccessor136.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.haulmont.chile.core.model.utils.MethodsCache.invokeGetter(MethodsCache.java:72) at com.haulmont.chile.core.model.impl.AbstractInstance.getValue(AbstractInstance.java:102) at com.haulmont.cuba.core.entity.BaseGenericIdEntity.getValue(BaseGenericIdEntity.java:140) at com.haulmont.chile.core.model.utils.InstanceUtils.getValueEx(InstanceUtils.java:139) at com.haulmont.cuba.web.gui.data.PropertyWrapper.getValue(PropertyWrapper.java:76) at com.haulmont.cuba.web.gui.components.WebAbstractTable$TablePropertyWrapper.getValue(WebAbstractTable.java:2006) at com.haulmont.cuba.web.gui.data.PropertyWrapper.getFormattedValue(PropertyWrapper.java:149) at com.haulmont.cuba.web.gui.components.WebAbstractTable$TablePropertyWrapper.getFormattedValue(WebAbstractTable.java:1992) at com.haulmont.cuba.web.toolkit.ui.CubaTable.formatPropertyValue(CubaTable.java:240) at com.haulmont.cuba.web.toolkit.ui.CubaTable.getPropertyValue(CubaTable.java:200) at com.vaadin.ui.Table.parseItemIdToCells(Table.java:2432) at com.vaadin.ui.Table.getVisibleCellsNoCache(Table.java:2282) at com.vaadin.ui.Table.refreshRenderedCells(Table.java:1780) at com.vaadin.ui.Table.refreshRowCache(Table.java:2732) at com.vaadin.ui.Table.containerItemSetChange(Table.java:4661) at com.haulmont.cuba.web.gui.data.CollectionDsWrapper.fireItemSetChanged(CollectionDsWrapper.java:109) at com.haulmont.cuba.web.gui.data.CollectionDsWrapper$ContainerDatasourceCollectionChangeListener.collectionChanged(CollectionDsWrapper.java:270) at com.haulmont.bali.events.EventRouter.fireEvent(EventRouter.java:45) at com.haulmont.cuba.gui.data.impl.CollectionDsListenersWrapper.collectionChanged(CollectionDsListenersWrapper.java:53) at com.haulmont.cuba.web.gui.components.WebAbstractTable$TableCollectionDsListenersWrapper.collectionChanged(WebAbstractTable.java:2999) at com.haulmont.cuba.gui.data.impl.WeakCollectionChangeListener.collectionChanged(WeakCollectionChangeListener.java:41) at com.haulmont.cuba.gui.data.impl.CollectionPropertyDatasourceImpl.fireCollectionChanged(CollectionPropertyDatasourceImpl.java:823) at com.haulmont.cuba.gui.data.impl.CollectionPropertyDatasourceImpl.resumeListeners(CollectionPropertyDatasourceImpl.java:838) at com.haulmont.cuba.gui.components.actions.AddAction$DefaultHandler.handleLookup(AddAction.java:395) at com.haulmont.cuba.gui.components.SelectAction.actionPerform(SelectAction.java:54) at com.haulmont.cuba.web.gui.WebWindow$Lookup.lambda$setLookupComponent$0(WebWindow.java:1816) at com.haulmont.cuba.web.gui.components.WebAbstractTable$4.actionPerform(WebAbstractTable.java:847) at com.haulmont.cuba.web.gui.components.WebAbstractTable.handleClickAction(WebAbstractTable.java:829) at com.haulmont.cuba.web.gui.components.WebAbstractTable.lambda$initComponent$4fd149ee$1(WebAbstractTable.java:707) at sun.reflect.GeneratedMethodAccessor205.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510) at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200) at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163) at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1037) at com.vaadin.ui.Table.handleClickEvent(Table.java:3220) at com.vaadin.ui.Table.changeVariables(Table.java:2997) at com.haulmont.cuba.web.toolkit.ui.CubaTable.changeVariables(CubaTable.java:252) at com.haulmont.cuba.web.toolkit.ui.CubaGroupTable.changeVariables(CubaGroupTable.java:144) at com.vaadin.server.communication.ServerRpcHandler.changeVariables(ServerRpcHandler.java:623) at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:470) at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:413) at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274) at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90) at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41) at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1436) at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361) at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:301) at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:192) at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.haulmont.cuba.web.sys.CubaHttpFilter.handleNotFiltered(CubaHttpFilter.java:116) at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:103) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)

Михаил,
Не могли бы вы воспроизвести проблему на тестовом проекте?

Константин, начал делать тестовый проект и увидел, что все работает. Стал искать искать отличия и таки их нашел. Проблема в том, что атрибуты внешней сущности, включенные в представление, используемое в browse-экране не были включены в представление, которое используется в edit-экране.
Не знаю корректное ли это поведение.
Если требуется, выложу проект, в котором моделируется.

Не соответствует действительности. “Буду посмотреть”

Upd: в общем разобрался до конца. Третью сущность привлекать нет необходимости. Дело в том, что на форме размещен LookupPickerField и соответственно CollectionDataSource. Тестовый проект приложил.
Сейчас при сохранении экземпляра entity2 происходит ошибка. Для того, чтобы этой ошибки не происходило, нужно в entity2-edit.xml изменить представление с _minimal на _local в CollectionDataSource, используемым LookupPickerField. Либо в основном DS изменить представление entity2-view-edit, изменив для partNumber представление c _minimal на _local.ExternalEntityProblemModelling_min.7z (166,8 КБ)

Здравствуйте,
Спасибо за Ваш тестовый проект. Мы воспроизвели проблему.
На самом деле, не имеет значение в каком датасторе находится связанная сущность (PartNumbers): в дополнительном или основном.
Данная проблема известна. Имеется тикет в YouTrack.
Чтобы избежать ее рекомендуется использовать одинаковые представления для эдитора и браузера сущности.

1 симпатия

Ростислав, спасибо за ответ.
Судя по тому, что я увидел, это не классифицировано как баг. В этом же статусе и останется?

Чтобы избежать ее рекомендуется использовать одинаковые представления для эдитора и браузера сущности.

Мне казалось, что для этого и нужны представления, чтобы не тащить на клиента атрибуты, которые в этой форме не нужны.

Ростислав был не точен. Не одинаковые представления конечно же, а представление редактора должно включать все поля представления браузера (т.е. редактор грузит больше полей чем строка браузера). Это нормально с точки зрения производительности.

1 симпатия