【发布时间】:2020-08-02 19:28:26
【问题描述】:
问题:
我有User 和Role 实体,并且关系是多对多的。首先我执行roleRepository.findById() 来获取角色,然后执行role.getUsers().forEach(user -> System.out.println(user.getId())); 来打印关联用户的ID。
当调用第一个方法时,会向role 表发出查询。并且当调用第二种方法时,会向role_users 和user 表发出连接查询。
是否可以通过任何注释让 hibernate 知道它应该使用一组 Proxy user 对象创建 Role 对象,以便在上述两种方法中永远不会使用 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()));
}
}
注意
我确实知道如何通过单独的查询获取关联实体的 ID。这是一个关于问题中突出显示的休眠注释的可能性的问题。
【问题讨论】:
-
我认为不可能随心所欲。您可以编写一个 JPQL 查询来检索这些 ID。
-
我也认为这是不可能的,如果您只需要 id 最好只为 id 列表编写 JPQL 查询。
-
我也有同样的想法,但我可以看到它适用于
ManyToOne和上面的情况,role.getUsers().size()与@LazyCollection(EXTRA)一起使用,这让我大吃一惊。而且这在逻辑上是可能的,因为所有相关数据都在role和role_users表中,所以问题是hibernate 实现是否支持它 -
好的,我不知道
ManyToOne有效!ManyToOne是如何工作的?我试过了,但它不适合我。 -
看这个。如果
Id的访问类型是property,你可以做getId()stackoverflow.com/questions/35013661/…
标签: spring-boot hibernate jpa spring-data-jpa