Проблема:
У меня есть сущности User
и Role
, и связь много ко многим. Сначала я выполняю roleRepository.findById()
, чтобы получить роль, а затем role.getUsers().forEach(user -> System.out.println(user.getId()));
, чтобы распечатать идентификаторы связанных пользователей.
При вызове первого метода запрос выполняется к таблице role
. И когда вызывается второй метод, запрос на соединение выдается к таблицам role_users
и user
.
Можно ли сообщить спящему режиму через любую аннотацию, что он должен создать Role
объект с набором Proxy user
объектов, так что во время двух вышеуказанных методов таблица User
никогда не используется?
Например, я могу аннотировать ассоциацию коллекции с помощью @LazyCollection(EXTRA)
, а затем role.getUsers().size()
отлично работает без использования таблицы user
.
Код
@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Access(AccessType.PROPERTY)
private Long id;
private String name;
@ManyToMany
private Set<User> users;
... getters and setters
}
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Access(AccessType.PROPERTY)
private Long id;
private String name;
@ManyToMany(mappedBy = "users")
private Set<Role> roles;
..getters and setters
}
public interface UserRepository
extends JpaRepository<User, Long> {
}
public interface RoleRepository
extends JpaRepository<Role, Long> {
Role findByName(String roleName);
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private RoleRepository roleRepository;
@Transactional
public void setUpSomeUsersAndRoles(){
User userOne = userRepository.save(new User("user-1"));
User userTwo = userRepository.save(new User("user-2"));
User userThree = userRepository.save(new User("user-3"));
Role roleOne = roleRepository.save(new Role("ADMIN"));
userOne.setRoles(singleton(roleOne));
userTwo.setRoles(singleton(roleOne));
userThree.setRoles(singleton(roleOne));
Set<User> users
= new HashSet<>(asList(userOne, userTwo, userThree));
roleOne.setUsers(users);
}
@Transactional
public void findRoleByName(){
Role role = roleRepository.findByName("ADMIN");
//I want the following to be executed
//without query issued to user table
role.getUsers()
.forEach(user -> System.out.println(user.getId()));
}
}
Примечание
Я знаю, как получить идентификаторы связанных сущностей с помощью отдельного запроса. Это специально вопрос о возможности аннотации спящего режима, как указано в вопросе.