Java Dropwizard无法延迟初始化角色集合
使用dropwizard 0.9.2和dropwizard hibernate 0.9.2,我试图用hibernate检索由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 -
@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;
}
}