我刚刚开始使用 Hibernate,并使用它通过 Jersey 构建 RESTful API。
为了习惯 Hibernate,我正在尝试为该实体实现 CRUD 操作(为了方便起见,我排除了 getter、setter 和注释):
public class People implements java.io.Serializable {
private Integer id;
private String name;
private String surname;
private String phone;
private String email;
private String dui;
private String address;
private Boolean state;
private Set userses = new HashSet(0);
public People() {
}
public People(String name, String surname, String phone, String email, String dui, String address) {
this.name = name;
this.surname = surname;
this.phone = phone;
this.email = email;
this.dui = dui;
this.address = address;
}
public People(String name, String surname, String phone, String email, String dui, String address, Boolean state, Set userses) {
this.name = name;
this.surname = surname;
this.phone = phone;
this.email = email;
this.dui = dui;
this.address = address;
this.state = state;
this.userses = userses;
}
}
由于我想获取该实体的记录列表,而不是其子实体(本例中的用户[是的,我知道该字段有一个有趣的名称]),因此我使用实体的构造函数来获取列表:
SessionFactory sesFact = HibernateUtil.getSessionFactory();
Session ses = sesFact.openSession();
Transaction tra = null;
tra = ses.beginTransaction();
String queryString = "SELECT new People(p.name, p.surname, p.phone, p.email, p.dui, p.address) FROM People p";
Query query = ses.createQuery(queryString, People.class);
List<People> people = query.list();
这种方法的问题是,我得到的实体列表没有它们各自的 id,并且我需要将它们放在返回列表中(...除非 Hibernate 有特殊原因不这样做,我不知道。如果有这样的事情,如果您指出这一点,我将不胜感激)。
那么,实现这一目标的最佳方法是什么?
我发现 Hibernate 生成的构造函数都没有将 id 作为参数。这有什么原因吗?
我可以创建一个包含 id 作为参数的自定义构造函数,但我真的不想更改生成的 POJO,因为我的数据库很可能会更改,并且如果我自动重新生成 POJO,我不想丢失所有硬编码的内容。
最佳答案
显然,我自己想出了一个解决方案。
在尝试不同的方法时,大多数时候我都会遇到LazyInitializationException。我一直将问题归咎于 Hibernate,因为我认为它在运行查询后立即自行引发了异常。但是,我没有意识到当 Jersey 尝试将实体序列化为 JSON 时,会触发关系的加载,因此由于关系被延迟加载而引发异常。所以问题出在 Jersey 而不是 Hibernate。由于我不习惯 Hibernate,所以出现了一系列有趣的困惑。
最后,我采用的方法是使用“标准”HQL 形式检索列表,它返回实体及其所有字段(包括 id),然后在将获取的列表返回到 Jersey Servlet 之前取消所获取列表中每个实体的关系:
tra = ses.beginTransaction();
String queryString = "FROM People";
Query query = ses.createQuery(queryString, People.class);
List<People> people = query.list();
for (People p : people) {
p.setUserses(null);
}
return people;
结果,我得到了没有子女关系的人员列表。
但是,我不完全确定这是否是最好的可能方法,因为如果我将其应用于需要加入各个实体的情况,我最终会得到大量嵌套的 foreach 来取消每个相关实体的不需要的关系。
关于java - 在 Hibernate 5.3 上获取带有 id 的实体列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52619625/