私は練習春のブートアプリケーションを作ってるんです。
私は(推奨されているように編集された)3つのエンティティを持っています:
class User extends EntityModelTemplate {
String username; //unique
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user")
List<UserRoles> userRoles;
}
@IdClass(UserRolesKey.class)
class UserRoles {
@Id
@ManyToOne
@JoinColumn(name = "user_id")
User user;
@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id")
Role role;
}
class Role extends EntityModelTemplate{
String role;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "role")
List<UserRoles> userRoles;
}
私が作りたかった単一私は仕様を使用してみましたので、役割と一緒にユーザーをフェッチしますDBの呼び出しを。私は、ドキュメントを読んで、私はそれが望んでいたように動作しなければならない何かを考え出す前にオンラインの例を検索します。
サービスメソッド(推奨されているように編集):
public UserDTO getUserForSecurityCheck(String username) throws UsernameNotFoundException {
log.info("Repository call start!");
Optional<User> user = userRepo.findOne(Specification.where(UserSpecifications.usernameEquals(username)));
log.info("Repository call end!");
return user.map(UserDTO::new).orElseThrow(() -> new UsernameNotFoundException("Username "+username+" not found!"));
}
仕様:
public static Specification<User> usernameEquals(String username){
return (root, query, criteriaBuilder) -> {
( (Join<Object, Object>) root.fetch(User_.USER_ROLES)).fetch(UserRoles_.ROLE);
return criteriaBuilder.equal(root.get(User_.USERNAME), username);
};
}
Hibernateは2 DB呼び出しを行う以外は完璧に動作します。
(編集)
一つ目は、ユーザ名は=ここで、二つが合流使用して必要とされているものをすべて選択しますか?(それが故に、長いかなり短い、短いバージョンです)。これは、私はそれをやってみたかったまさにです。しかし、それは文字通り、ユーザーのuser_id =から(userRolesを除く)を選択*を行い、2番目の呼び出しを行い?。
どうして?
私は一般的にコーディングではまだ初心者だにもかかわらず、私はかなり確信して、私はどのように仕様とHibernateの仕事を理解しました。基本、少なくとも。もちろん、私にはありません。
だから、私の質問は:それは、二つのDBの呼び出しや、私が何をやっている間違ったを行うことが想定されますか?
前もって感謝します。
私は私のミスを見つけたと私はかなりすぐにそれに気付いていないために恥ずかしい:UserRoles内のユーザーは、デフォルトでは熱心にロードされます。すなわち、第2のコールでした。私は怠け者にそれを変更し、意図したとおりに働いています。
それはM.Deinumが遅延コレクションについての質問がなかったら、私は万年でそれに気づいていないだろうしました。