我正在尝试在 Spring 上提供应用程序,并在实体之间提供延迟获取关系。
模型“用户”:
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
}
使用@EntityGraph继承JPA存储库。通过此,我试图为选定的用户提供与以下相关的所有跟踪器:
@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);
}
}
和 Controller :
@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);
}
}
查询“/customers/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]"}
最佳答案
哦,这是一个愚蠢的错误。在用户中我写了“trakers”。但在 CrudUserRepository 的 attributePaths“traCkers”中。
关于java - 无法在此 ManagedType 上找到具有给定名称 [trackers] 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60763225/