【问题标题】:LazyInitializationException when returning JSON in REST Webservice in Quarkus在 Quarkus 的 REST Web 服务中返回 JSON 时出现 LazyInitializationException
【发布时间】:2019-12-04 07:29:53
【问题描述】:

我正在尝试使用 Quarkus 构建一个简单的应用程序。目前,我有两个实体类,它们是一对多相关的:

@Entity
public class Person extends PanacheEntity {

    public String name;
    public LocalDate birthdate;

    @OneToMany(mappedBy = "person")
    public List<Address> addresses; 

    public static Person findByNameFirst(String name) {
        return find("name", name).firstResult();
    }
}

@Entity
public class Address extends PanacheEntity {

    public String street;
    ...etc...

    @ManyToOne
    public Person person;
}

这些被一个简单的 REST web 服务使用,它应该将一个人存储到数据库中,再次选择它并返回它:

@GET
@Path("storePerson")
@Produces(MediaType.APPLICATION_JSON)
@Transactional
public Person storePerson(
        @QueryParam("name")String name, 
        @QueryParam("birthdate")String birthdate) 
{
    LocalDate birth = LocalDate.parse(birthdate, DateTimeFormatter.BASIC_ISO_DATE);
    Person person = new Person(name, birth);
    person.persistAndFlush();
    Person p2 = Person.findByNameFirst(name);
    return p2;
}

第一次调用 web 服务时,结果是一个带有存储数据的 JSON 对象,这与预期的一样。再次调用时,会抛出内部服务器错误:

org.hibernate.LazyInitializationException: Unable to perform requested lazy initialization [Person.addresses] - no session and settings disallow loading outside the Session

据我了解,之所以会引发错误,是因为事务只持续到 storePerson 方法结束,但到 JSON 的转换发生在方法之外。

如何防止此错误?我已阅读有关休眠参数“enable_lazy_load_no_trans”的信息,但 Quakus 的 application.properties 似乎不支持它。

【问题讨论】:

    标签: json hibernate resteasy jsonb quarkus


    【解决方案1】:

    这个想法是使用 MapStruct 之类的映射器框架。

    我们不建议直接公开您的实体,原因有两个:

    • 您遇到的问题,
    • 从长远来看 API 管理:您可能需要更改模型而不是 API 或相反。

    这里有一个例子:https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-quarkus

    使用的 Quarkus 版本有点旧,但 AFAICS 应该仍然适用于最新的 Quarkus。

    【讨论】:

      【解决方案2】:

      您可以使用Hibernate.initialize(person.addresses) 使错误消失,然后在事务结束之前初始化集合。

      【讨论】:

      • 对我没有帮助
      猜你喜欢
      • 2011-08-24
      • 1970-01-01
      • 2012-05-17
      • 2013-10-19
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多