#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:
Просто переименуйте этот класс, я думаю, вы не можете использовать два класса (сущности) с одинаковым именем. Попробуйте переименовать его и вызвать его снова, должно сработать 🙂