我对使用 Spring MVC 3.1.2 和 Jackson 2 时遇到的错误感到疯狂。
我有以下模型类:
@Entity
@Table(name = "USER")
@JsonIgnoreProperties(ignoreUnknown=true)
public class User implements Serializable
{
@Id
@SequenceGenerator(name = "USER_ID", sequenceName = "USER_ID_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_ID")
private Long id;
@Column(length = 50, nullable = false)
private String firstName;
@Column(length = 50, nullable = false)
private String lastName;
@ManyToMany
@JoinTable(name = "FRIENDS",
joinColumns = @JoinColumn(name = "personId"),
inverseJoinColumns = @JoinColumn(name = "friendId")
)
@JsonManagedReference
private List<User> friends;
@ManyToMany
@JoinTable(name="FRIENDS",
joinColumns=@JoinColumn(name="friendId"),
inverseJoinColumns=@JoinColumn(name="personId")
)
@JsonIgnore
private List<User> friendOf;
// Other attributes and methods...
}
当我获得 User 的单个实例时,杰克逊会正确序列化它。但是当我尝试获取包含朋友的 User 实例时,会引发以下异常:
org.hibernate.LazyInitializationException:未能延迟初始化
角色集合:com.frooid.model.User.friends,无会话或
会议已结束
我使用单个 HQL 获取此实例:
select u from User u left join fetch u.friends f where u.id = :id
谢谢大家!
尝试使用OpenSessionInViewFilter
虽然这是为了访问视图中的延迟初始化字段,但它可能会保持会话打开,以便 Jackson 能够访问集合。
The OpenSessionInViewFilter
将 Hibernate Session 绑定到线程以完成请求的整个处理。适用于“在视图中打开会话”模式,即允许在 Web 视图中延迟加载,尽管原始事务已经完成。
在 Web.xml 中
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
API文档 http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/orm/hibernate3/support/OpenSessionInViewFilter.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)