Hibernate延迟加载子实体中的父实体(@ManyToOne)

时间:2015-04-27 16:05:21

标签: hibernate lazy-loading many-to-one

我在Hibernate(4.2)中有2个具有Parent Child关系的实体。

@Entity
@Table(name = "WORLDZONE")
public class Worldzone implements java.io.Serializable {
    @Column
    private BigDecimal id;

    @Column
    private Integer version;

    @Column
    private String worldZoneCd;
    // setters & getters
}


@Entity
@Table(name = "COUNTRY")
public class Country implements java.io.Serializable {
    @Column
    private BigDecimal id;

    @Column
    private Integer version;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "WORLDZONE_ID")
    private Worldzone worldzone;
    // setters & getters
}

在Spring MVC(4.1.3)中,我使用Jackson ObjectMapper将我的服务响应转换为JSON。

在转换Child实体的响应时,Jackson失败并出现错误 - no session。基本上,在将对象转换为JSON时,它没有发现Hibernate会话延迟加载数据并将其转换为JSON。

我的问题是,允许Jackson为延迟加载父实体提供会话所需的配置。

我尝试过以下选项但没有运气 -

选项1:

使用此link

中的信息添加了自定义ObjectMapper
public class HibernateAwareObjectMapper extends ObjectMapper {
    public HibernateAwareObjectMapper() {
        Hibernate4Module hm = new Hibernate4Module();
        hm.configure(Hibernate4Module.Feature.FORCE_LAZY_LOADING, true);
        registerModule(hm);  
    }
}

在servlet-context.xml中配置消息转换器后,错误停止。但是对于Parent来说数据是空的。

选项2:

在web.xml中配置OpenSessionInViewFilter。但在对象转换时,杰克逊无法使用会话。

任何指针都会有所帮助。感谢。

1 个答案:

答案 0 :(得分:-2)

如果您通过休息控制器或mvc控制器提供实体服务。将其标记为@Transactional,这将使会话在休眠状态下打开,并允许在杰克逊踩到它们时评估延迟加载的属性。我个人会将你的实体与你的DTO分开,并使用像Dozer这样的东西来进行2之间的映射。这样你就可以从存储库封装获取并投射到服务中的DTO逻辑,而这可以是事务性的。