我在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
中的信息添加了自定义ObjectMapperpublic 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
。但在对象转换时,杰克逊无法使用会话。
任何指针都会有所帮助。感谢。
答案 0 :(得分:-2)
如果您通过休息控制器或mvc控制器提供实体服务。将其标记为@Transactional,这将使会话在休眠状态下打开,并允许在杰克逊踩到它们时评估延迟加载的属性。我个人会将你的实体与你的DTO分开,并使用像Dozer这样的东西来进行2之间的映射。这样你就可以从存储库封装获取并投射到服务中的DTO逻辑,而这可以是事务性的。