在子实体(@ManyToOne)中休眠父实体的懒惰加载



我在Hibernate(4.2)中有两个具有父子关系的实体。

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

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

转换Child实体的响应时,Jackson失败,返回错误-no session。基本上,在将对象转换为JSON时,它不会找到Hibernate会话来延迟加载数据并将其转换为JSON。

我的问题是,需要什么配置才能让Jackson拥有一个可用于延迟加载Parent实体的会话。

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

选项1:

使用此链接中的信息添加了自定义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的数据为null。

选项2:

在web.xml中配置了OpenSessionInViewFilter。但在转换对象时,会话对Jackson不可用。

任何指示都会有所帮助。谢谢

如果您通过rest控制器或mvc控制器为实体提供服务。将其标记为@Transactional,这将使会话在hibernate中保持打开状态,并允许在Jackson介入延迟加载的属性时对其进行评估。我个人会将您的实体与DTO分离,并使用类似Dozer的东西在2之间进行映射。通过这种方式,您可以封装从存储库获取的数据,并将其投影到服务中的DTO逻辑,而服务可以是事务性的。

最新更新