Jhipster, Как лениво загружать сущности ... Pom config, - PullRequest
1 голос
/ 30 января 2020

У меня есть эта модель: Вы можете вставить ее здесь https://start.jhipster.tech/jdl-studio/

entity NmsDomain {
  name String required,
  logo ImageBlob,
  brandImg ImageBlob
}


entity NmsTenant {
  name String required,
  image ImageBlob
}


entity NmsZone {
  name String required,
  description String,
  active Boolean,
  lastModifiedDate ZonedDateTime,
  lastModifiedBy String 
}

entity NmsEmployee {
  extensionNumber String,
  photo ImageBlob
}


entity NmsEmployeeLog {
  begin ZonedDateTime,
  end ZonedDateTime,
  deviceType String,
  make String, 
  model String, 
  imei String, 
  serialNumber String, 
  ipAddress String, 
  macAddress String, 
  wifiNetwork String
}

relationship OneToOne {
  NmsEmployee{user(firstName)} to User
  }


  relationship ManyToMany {
  NmsEmployee{possibleZones(name)} to NmsZone{employeePossible}, 
  NmsEmployee{activeZones(name)} to NmsZone{employeeActive}, 
  NmsEmployee{possibleTenants(name)} to NmsTenant{employeePossible}, 
  NmsDomain{user(firstName)} to User{NmsDomain}
}


relationship ManyToOne {
  NmsEmployeeLog{employee} to NmsEmployee, 
  NmsEmployeeLog{zone(name)} to NmsZone, 
  NmsEmployee{domain(name)} to NmsDomain,
  NmsEmployee{tenant(name)} to NmsTenant, 
 NmsTenant{domain(name)} to NmsDomain, 
  NmsZone{tenant(name)} to NmsTenant
}

EmployeeLog. java:

    @ManyToOne(fetch = FetchType.LAZY) 
    @JsonIgnoreProperties("nmsEmployeeLogs")
    private NmsEmployee employee;

    @ManyToOne
    @JsonIgnoreProperties("nmsEmployeeLogs")
    private NmsZone zone;

EmployeeLogRepository:

@Query(value ="SELECT entity FROM NmsEmployeeLog entity WHERE entity.employee.id = :empId",
countQuery ="select count(entity) FROM NmsEmployeeLog entity WHERE entity.employee.id = :empId")

Page<NmsEmployeeLog> findByEmpId(@Param("empId") Long empId, Pageable pageable);

Я получаю всю информацию о сотрудниках, пользователях, доменах и арендаторах, связанную с большим количеством изображений. Очень медленно ... только для 1 строки в EmployeeLog я получаю:

[
  {
    "id": 6,
    "begin": "2019-02-03T07:54:00Z",
    "end": "2019-02-03T07:54:00Z",
    "deviceType": null,
    "make": null,
    "model": null,
    "imei": null,
    "serialNumber": null,
    "ipAddress": null,
    "macAddress": null,
    "wifiNetwork": null,
    "employee": {
      "id": 11,
      "extensionNumber": "1223",
      "photo": "iVBORw0KGgoAAAANSUhEUg ….LOTS OF IMAGE CODE.”,
      "photoContentType": "image/png",

      "user": {
        "id": 3,
        "login": "admin",
        "firstName": "Admin",
        "lastName": "IGomes",
        "email": “m…”,
        "activated": true,
        "langKey": "pt-pt",
        "imageUrl": "",
        "resetDate": null
      },
      "domain": {
        "id": 2,
        "name": "Fe ",
        "logo": "/9j/4 ….LOTS OF IMAGE CODE”,
        "brandImgContentType": "image/jpeg",
        "brandLink": null

      },
      "tenant": {
        "id": 4,
        "name": "Heathlands V",
        "image": “LOTS OF IMAGE CODE…..”,
        "imageContentType": "image/jpeg",
        "domain": {
          "id": 2,
          "name": "Feds ",
          "logo": "/9j/4A== ….”,
          "logoContentType": "image/jpeg",
          "brandImg": "/9j/4AAQSkAAH//Z …..LOTS OF IMAGE CODE”,
          "brandImgContentType": "image/jpeg"

        }
      },
      "possibleZones": null,
      "activeZones": null,
      "possibleTenants": null
    },
    "zone": {
      "id": 27,
      "name": "EHBlk EH1",
      "description": "EH Block 1",
      "active": true,
      "lastModifiedDate": "2019-09-28T11:39:32Z",
      "lastModifiedBy": "Louis ",
      "tenant": {
        "id": 4,
        "name": "Heathlands V",
        "image": "/9j/4AAQSkZJRgABAQAAA …. LOTS OF IMAGE CODE”,
        "imageContentType": "image/jpeg",
        "domain": {
          "id": 2,
          "name": "Fed ",
          "logo":  LOTS OF IMAGE CODE….”,
          "brandImgContentType": "image/jpeg",
        }
      }
    }
  },
  {
Next Row Log ...

вместо только этих полей:

public interface EmployeeLog {
     Long getId();
     ZonedDateTime getBegin();
     ZonedDateTime getEnd();
     String getDevice();
     String getType();
     String getMake();
     String getModel();
     String getImei();
     String getSerialNumber();
     String getIpAddress();
     String getMacAddress();
     String getWifiNetwork();
}

Если я создаю интерфейс или DTO и выбираю просто эти поля. Это работает: я не получаю ничего лишнего.

Но мне нужно сделать это для большинства сущностей ...

Есть ли способ указать ленивую нагрузку в сущность?

Или какой-то простой способ указать поля, которые я хочу, и те, которые мне не нужны, без необходимости делать DTO для всех сущностей?

1 Ответ

1 голос
/ 31 января 2020

1 - аннотация вида json (более гибкая)

https://mkyong.com/java/jackson-jsonview-examples/ или https://www.logicbig.com/tutorials/misc/jackson/json-view-annotation.html или https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring

AllViews. java:

public class AllViews {
     public interface List {}
     public interface Edit {}
}

EmployeeLog. java:

   @JsonView(AllViews.List.class)
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @JsonView(AllViews.List.class)
    @Column(name = "begin")
    private ZonedDateTime begin;

    @JsonView(AllViews.List.class)
    @Column(name = "end")
    private ZonedDateTime end;

    @JsonView(AllViews.List.class)
    @Column(name = "device_type")
    private String deviceType;

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

    @JsonView(AllViews.List.class)
    @Column(name = "model")
    private String model;

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

    @JsonView(AllViews.List.class)
    @Column(name = "serial_number")
    private String serialNumber;

    @JsonView(AllViews.List.class)
    @Column(name = "ip_address")
    private String ipAddress;

    @Column(name = "mac_address")
    private String macAddress;

    @JsonView(AllViews.List.class)
    @Column(name = "wifi_network")
    private String wifiNetwork;

EmployeeLogResource:

@JsonView(AllViews.List.class)
    @GetMapping("/nms-employee-logsByEmployeeId/{empId}")
    public ResponseEntity<List<NmsEmployeeLog>> getResidentsByTenantId(final Pageable pageable,
            @PathVariable final Long empId) {
        log.debug("REST request to get a page of NmsEmployeeLog ByTenantId");

        final Page<NmsEmployeeLog> page = nmsEmployeeLogRepository.findByEmpId(empId, pageable);
        final HttpHeaders headers = PaginationUtil
                .generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page);
        return ResponseEntity.ok().headers(headers).body(page.getContent());
    }

результат:

[

  {
    "id": 6,
    "begin": "2019-02-03T08:54:00+01:00",
    "end": "2019-02-03T08:54:00+01:00",
    "deviceType": some device,
    "model": some model,
    "serialNumber": xxxxx,
    "ipAddress": xx.xx.xx,
    "wifiNetwork": wifi
  },

2- или The Lazy Way (не такой гибкий)

Я добавляю это в pom. xml и сделай ./mvn clean compile (кажется, я забыл это)

        <plugin>
            <groupId>org.hibernate.orm.tooling</groupId>
            <artifactId>hibernate-enhance-maven-plugin</artifactId>
            <version>${hibernate.version}</version>
            <executions>
                <execution>
                    <configuration>
                        <failOnError>true</failOnError>
                        <enableLazyInitialization>true</enableLazyInitialization>
                    </configuration>
                    <goals>
                        <goal>enhance</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...