Как добиться ленивой загрузки с использованием данных весны jpa? - PullRequest
0 голосов
/ 28 ноября 2018

В моем проекте я использую Spring Data JPA и расширяю интерфейс JpaRepository для своего класса извлечения данных.

OrganizationMaster class:

  @Entity
  @Table(name="organization_master")
  public class OrganizationMaster  {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="organization_id")
    private int organizationId;

    @OneToMany(mappedBy="organizationMaster")
        private List<CompanyMaster> companyMasters;
    }

CompanyMaster Class:

Entity
@Table(name="company_master")
public class CompanyMaster {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="company_id")
    private int companyId;


    @ManyToOne
    @JoinColumn(name="organization_id")
    private OrganizationMaster organizationMaster;
}

Мой контроллер

@RequestMapping(value = "/GetOrganization", method = RequestMethod.GET)
    public
    @ResponseBody
    List<OrganizationMaster> getOrganization(){
       return organizationService.getOrganization();
    }

ОрганизацияСервис:

public interface OrganizationService {
   List<OrganizationMaster> getOrganization();
}

OrganizationServiceImpl:

@Service
public class OrganizationServiceImpl implements OrganizationService{
    @Autowired
    private OrganizationDao organizationDao;
    @Override
    public List<OrganizationMaster> getOrganization() {
        return organizationDao.findAll();
    }
}

Интерфейс OrganizationDao:

public interface OrganizationDao extends JpaRepository<OrganizationMaster,Long> {
}

Мой выходной ответ: [{"organizationId": 5, "companyMasters": [{{companyId ": 29}, {" companyId ": 30}]}]

Но мне нужно [{"organizationId": 5}]

Когда я пытаюсь получить данные из основной записи организации, используя метод findall () , он также извлекает данные из основной записи компании на основе отношения.Как я могу добиться ленивого извлечения ( получить данные только от хозяина организации ), используя данные весны JpaRepository

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Все ассоциации XToOne являются EAGER по умолчанию.У вас двунаправленные отношения, поэтому вы должны использовать FetchType.LAZY на вашей @ ManyToOne стороне.

@ManyToOne(fetch = FetchType.LAZY)

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

Другое соображение при использовании Lombok, аннотация @ Data вызывает загрузку ленивых элементов без необходимости.Так что будьте осторожны при использовании Lombok.

Так что в вашем случае, потому что вы возвращаете саму сущность, в то время как при сериализации она также сериализует дочерний объект, он вызывает загрузку ленивого дочернего объекта.

Вам необходимовернуть dto, который представляет только вашу родительскую сущность, чтобы предотвратить сериализацию дочерней сущности.Если вы вызываете метод child с помощью метода get, он извлекает ленивую дочернюю сущность из базы данных.

Найдите дополнительные информационные ассоциации:

https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

0 голосов
/ 28 ноября 2018

Я считаю, что этот вопрос задавался раньше! Вы можете использовать эту аннотацию:

@ OneToMany (fetch = FetchType.LAZY)

прочтите эту статью для лучшего обзора в этом пункте:

https://howtodoinjava.com/hibernate/lazy-loading-in-hibernate/

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