Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Dropwizard无法延迟初始化角色集合_Java_Hibernate_Jackson_Dropwizard - Fatal编程技术网

Java Dropwizard无法延迟初始化角色集合

Java Dropwizard无法延迟初始化角色集合,java,hibernate,jackson,dropwizard,Java,Hibernate,Jackson,Dropwizard,使用dropwizard 0.9.2和dropwizard hibernate 0.9.2,我试图用hibernate检索由@OneToMany映射的集合。不幸的是,我遇到了以下异常: com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.ng.Computer.parts, could not initialize proxy -

使用dropwizard 0.9.2和dropwizard hibernate 0.9.2,我试图用hibernate检索由
@OneToMany
映射的集合。不幸的是,我遇到了以下异常:

com.fasterxml.jackson.databind.JsonMappingException: failed to lazily 
initialize a collection of role: com.ng.Computer.parts, could not 
initialize proxy - no Session
我确实理解为什么会发生这种情况(当jackson尝试序列化对象时,hibernate会话关闭),但库jackson-datatype-hibernate4(它是dropwizard hibernate的依赖项)不应该自动为我处理这一问题(重新打开会话并实现集合)?如果不是,这个库在做什么?大多数dropwizard应用程序是如何解决这个问题的(急切抓取不是一个选项)

Pom.xml

  <dependency>
      <groupId>io.dropwizard</groupId>
      <artifactId>dropwizard-core</artifactId>
      <version>0.9.2</version>
  </dependency>

  <dependency>
      <groupId>io.dropwizard</groupId>
      <artifactId>dropwizard-testing</artifactId>
      <version>0.9.2</version>
  </dependency>

  <dependency>
      <groupId>io.dropwizard</groupId>
      <artifactId>dropwizard-hibernate</artifactId>
      <version>0.9.2</version>
  </dependency>
道:

公共类ComputerDAOImpl扩展了AbstractDAO实现
电脑刀{
公共计算机DAOIMPL(会话工厂会话工厂){
超级(sessionFactory);
}
公共计算机findById(长计算ID){
计算机=获取(计算ID);
返回计算机;
}
}

阅读文档时,这可能是出于设计:

重要的

Hibernate会话在资源恢复之前关闭 方法的返回值(例如,数据库中的人员),其中 表示您的资源方法(或DAO)负责初始化 所有延迟加载的集合等,然后返回。否则,, 您将在模板中引发LazyInitializationException(或 Jackson生成的空值)

因此,您的代码似乎需要专门负责加载这些部件,而不是使用这些部件运行

或者通过快速查看文档来判断,您的问题是UnitOfWork注释。这个人负责结束你的课程。阅读文档:

这将自动打开会话、开始事务、调用 findByPerson,提交事务,最后关闭会话。 如果抛出异常,事务将回滚

结合以上内容:如果您想使用UnitOfWork,您必须自己实现延迟加载,因为UnitOfWork将在您开始之前关闭您的会话。如果您不想使用它,则必须以不同的方式处理事务

我希望这有帮助


Artur

阅读文档时,这可能是出于设计:

重要的

Hibernate会话在资源恢复之前关闭 方法的返回值(例如,数据库中的人员),其中 表示您的资源方法(或DAO)负责初始化 所有延迟加载的集合等,然后返回。否则,, 您将在模板中引发LazyInitializationException(或 Jackson生成的空值)

因此,您的代码似乎需要专门负责加载这些部件,而不是使用这些部件运行

或者通过快速查看文档来判断,您的问题是UnitOfWork注释。这个人负责结束你的课程。阅读文档:

这将自动打开会话、开始事务、调用 findByPerson,提交事务,最后关闭会话。 如果抛出异常,事务将回滚

结合以上内容:如果您想使用UnitOfWork,您必须自己实现延迟加载,因为UnitOfWork将在您开始之前关闭您的会话。如果您不想使用它,则必须以不同的方式处理事务

我希望这有帮助

阿图尔

@Entity
public class Computer {

    @Id
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    private String name;

    @JsonIgnore
    @OneToMany
    public List<Part> parts;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Part> getParts() {
        return parts;
    }

    public void setParts(List<Part> parts) {
        this.parts = parts;
    }
}

@Entity
public class Part {
    @Id
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}
@GET
@UnitOfWork
@Timed
public Response list() {

    Computer computer = computerDAO.findById(1L);

    Response response = Response.ok(computer.getParts()).build();

    return response;
}
public class ComputerDAOImpl extends AbstractDAO<Computer> implements    
ComputerDAO{

    public ComputerDAOImpl(SessionFactory sessionFactory) {
        super(sessionFactory);
    }

    public Computer findById(Long computationId) {
        Computer computer = get(computationId);
        return computer;
    }
}