java - 在 Hibernate 5.3 上获取带有 id 的实体列表

标签 java hibernate jpa

我刚刚开始使用 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/

相关文章:

java - 使用 float 创建累积数组

java - Dropwizard 配置覆盖

java - Hibernate的mappedBy和ManyToMany

spring-boot - 在 Spring Boot 2 中,如何自动生成我的数据库并将模式生成命令记录到文件中?

java - 如何在 JPQL 中对同一个表使用两次连接?

java - PhantomJSDriver.getCurrentUrl() 返回约 :blank

java - 无法生成随机字母的 key ,这些字母在整个 key 中仅使用/找到一次

spring - 在 JPA/hibernate 和 spring 中使用 joda time

java - Hibernate复合键映射问题

java - 了解 Java 中的注解处理