Хранилище данных Spring с тем же именем класса сущности, но в другом пакете

#jpa #spring-data-jpa

#jpa #spring-data-jpa

Вопрос:

У меня есть два класса сущностей с одинаковыми именами, но они находятся в разных пакетах и имеют разные идентификаторы.

 package sample.visa;

@Entity
@Table(name="APP_VISA")
public class Application
{
    @Id
    private Integer id;
    ...
}

  
 package sample.student;

@Entity
@Table(name="APP_STU")
public class Application
{
    @Id
    private String studentId;
    ...
}

  

Затем у меня есть хранилище данных Spring для извлечения из одного из классов сущностей.

 package sample.student;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ApplicationRepository extends CrudRepository<sample.student.Application, String>
{   
}

  

Когда я попытался вызвать метод find (например, findById) во внедренном репозитории, я предположил, что он должен был запросить таблицу базы данных APP_STU . Однако на самом деле он запросил APP_VISA и вернул следующее сообщение об ошибке.

 java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: studentId of: sample.visa.Application
  

Есть ли какой-нибудь способ настроить таргетинг репозитория на APP_STU вместо этого? Или переименование класса — единственный способ решить эту проблему?

Ответ №1:

Невозможно иметь повторяющееся имя для двух разных объектов для одного проекта, даже если объекты находятся в двух разных пакетах.

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

Ссылка

Комментарии:

1. В JPQL я могу явно указать полное имя класса (например, ВЫБРАТЬ obj ИЗ sample.visa. Объект приложения, ГДЕ obj.id = ? «), чтобы позволить JPA запрашивать правильную таблицу. Поэтому мне просто интересно, возможно ли это при использовании Spring Data. Но, похоже, использование разных имен классов — лучший способ избавиться от него.

Ответ №2:

Просто переименуйте этот класс, я думаю, вы не можете использовать два класса (сущности) с одинаковым именем. Попробуйте переименовать его и вызвать его снова, должно сработать 🙂