我有两个 Java Hibernate
实体 user
和 userPick
:
@Entity
@Table(name="users")
public class User{
@Column(length=50)
private String name;
@OneToMany
private List<UserPick> userPicks = new ArrayList<UserPick>(0);
...
和
@Entity
@Table(name="usersPicks")
public class UserPick {
...
User user; // this line no exist in code
// I want get it when load all picks
// I am confused here or I can do it, because in user is
// List<userPick> and it sounds like circle
// user.getUserPicks().getUser().getUserPicks()....
...
当我加载用户时一切正常。
public User findByUserName(String name) {
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("name",name));
List<User> users = criteria.list();
if (users.size() > 0) {
return users.get(0);
} else {
return null;
}
}
但是我正在寻找如何将所有 usersPick's
放在一个列表中并选择用户,例如:
public List<UserPick> getAllPicks(){
Criteria criteria = session.createCriteria(UserPick.class);
List<UserPick> picks = criteria.list();
return picks;
}
我想打印选择用户名System.out.print(picks.get(0).getUser().getName())
最佳答案
可以在 UserPick
中与 User
关联。要通过 UserPick
中的外键 fk_user
关联 User
和 UserPick
,请添加 mappedBy = “user”
到 User
并在 UserPick
中与 User
惰性关联。要指定外键列名称,您需要@JoinnColumn(name = "fk_user")
。
@Entity
@Table(name="users")
public class User{
@Column(length=50)
private String name;
@OneToMany(mappedBy = "user")
private List<UserPick> userPicks = new ArrayList<UserPick>();
}
@Entity
@Table(name="usersPicks")
public class UserPick {
@ManyToOne(fetch = FetchType.LAZY)
@JoinnColumn(name = "fk_user")
private User user;
}
您可以按照@StanislavL建议的方式获取用户(除非您不需要为user
创建别名)
public List<UserPick> getAllPicks(){
Criteria criteria = session.createCriteria(UserPick.class)
.setFetchMode("user", FetchMode.JOIN);
return criteria.list();
}
即使 UserPick
中与 User
的关联不是惰性的,这也不是问题,因为 Hibernate 使用缓存来设置相同的 User
到所有用户的UserPick
。
关于Java hibernate获取所有实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35013994/