2016-03-05 98 views
0

使用dropwizard 0.9.2和dropwizard-hibernate 0.9.2,我試圖檢索由@OneToMany與hibernate映射的集合。不幸的是我得到這個異常:Dropwizard未能懶洋洋地初始化一個角色集合

com.fasterxml.jackson.databind.JsonMappingException: failed to lazily 
initialize a collection of role: com.ng.Computer.parts, could not 
initialize proxy - no Session 

我不明白爲什麼會發生(休眠會話時傑克遜試圖序列化對象關閉),但應該不是庫傑克遜的數據類型,hibernate4(其是dropwizard-hibernate的依賴項)自動爲我處理這個問題(重新打開會話並實現集合)?如果不是這個庫在做什麼以及大多數dropwizard應用程序如何解決這個問題(EAGER抓取不是一個選項)?

的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> 

模型

@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; 
} 

DAO:

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; 
    } 
} 

回答

0

閱讀文檔,這可能是由設計:

重要

的Hibernate的Session在你的資源 方法的返回值之前關閉(例如,從數據庫中的人),這 意味着你的資源的方法(或DAO)負責在返回之前初始化所有延遲加載的集合等。否則, 你會得到一個LazyInitializationException拋出你的模板(或由Jackson生成的 空值)。

因此,您的代碼似乎需要專門負責加載部件,而不是使用它來運行。

或者通過快速查看文檔來判斷,您的問題是UnitOfWork註釋。這個負責關閉你的會話。閱讀文檔:

這會自動打開一個會話,開始一個事務,調用 findByPerson,提交事務,最後關閉會話。 如果拋出異常,則事務回滾。

與以上相結合:如果您想使用UnitOfWork,您必須自己實現延遲加載,因爲UnitOfWork會在您到達之前關閉會話。如果你不想使用它,你將不得不以不同的方式處理你的交易。

我希望幫助。

Artur

相關問題