Я пытаюсь предоставить Application on Spring отношение Lazy-Fetch между сущностями.
Модель "Пользователь":
Entity
@Table(name = "users")
@Component
public class User {
@Id
@SequenceGenerator(name = "userseq", sequenceName = "userseq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "userseq")
private Integer id;
// Some fields/getters/setters
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private List<Tracker> trakers;
}
Модель "Трекеры"
@Entity
@Table(name = "trackers")
@Component
public class Tracker {
@Id
@SequenceGenerator(name = "tracker_seq", sequenceName = "tracker_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tracker_seq")
private Integer id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", insertable=false, updatable=false)
@OnDelete(action = OnDeleteAction.CASCADE)
private User user;
// Some fields/getters/setters
}
Унаследованный JPA-репозиторий с @EntityGraph. Этим я пытаюсь предоставить избранному пользователю все трекеры, связанные с:
@Repository
@Transactional(readOnly = true)
public interface CrudUserRepository extends JpaRepository<User, Integer> {
@EntityGraph (attributePaths = {"trackers"}, type = EntityGraph.EntityGraphType.LOAD)
@Query("SELECT u FROM User u WHERE u.id=?1")
User getByIdWithTrackers(int id);
}
Класс репозитория:
@Repository
public class AnketUserRepository implements UserRepository {
@Autowired
private CrudUserRepository crudRepository;
@Override
public User getByIdWithoutTrackers(int id) {
return crudRepository.findById(id).orElse(null);
}
@Override
public User getByIdWithTrackers(int id){
return crudRepository.getByIdWithTrackers(id);
}
}
И контроллер:
@RestController ("userRestController")
@RequestMapping(value = UserRestController.USER_URL, produces =
MediaType.APPLICATION_JSON_VALUE)
public class UserRestController extends AbstractUserController {
public static final String USER_URL = "/customers";
@GetMapping("/{id}")
public User getByIdWithoutTrackers(@PathVariable int id) {
return super.getByIdWithoutTrackers(id);
}
@GetMapping("/{id}/withTrackers")
public User getByIdWithTrackers(@PathVariable int id) {
return super.getByIdWithTrackers(id);
}
}
Запрос "/ клиентов / 1" работает нормально. Возвращает всех клиентов без трекеров (соответственно Lazy-Fetch).
Но "/ Customers / 1 / withTrackers" возвращает следующее исключение:
lang.IllegalArgumentException: Unable to locate Attribute with the the given name [trackers] on this ManagedType [ru.spb.model.User]"}