【发布时间】:2012-11-13 08:10:14
【问题描述】:
我因使用 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 实例时,它被 Jackson 正确序列化。但是当我尝试获取包含好友的 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
谢谢大家!
【问题讨论】:
-
您可以发布尝试访问该集合的代码吗?是在jsp还是控制器中访问集合?
-
我使用 Spring MVC 访问它,通过控制器到服务,然后在 DAO 中。控制器通过 JQuery 使用 getJSON 方法访问。
-
也许是个愚蠢的问题,但您的服务是否标有@Transactional?可以发一下你的服务方式吗?
-
通过浏览器直接访问(如localhost:8084/frooid/app/user/get/17)没有好友的实例,我得到如下结果:
{"id":17,"firstName":"Marcelo","lastName":"Juventino","email":"marcelo@frooid.com","password":"Whb8P4v086kKz2fQbQaDbqvrUZ8=","genre":"M","birth":340081200000,"urlPhoto":"http://...","thought":"Teste de envio de mensagem 8...","bio":"Esta eh a area reservada a bio...","friends":[]}当实例与好友相关时,出现异常。 -
@kmb385 我的服务方法如下:`@Transactional(readOnly=true) public User get(Long userId) { return userDAO.get(userId); } `
标签: json spring hibernate hql jackson