0
我捕捉一些異常試圖getUserRole()接線問題。 org.hibernate.LazyInitializationException:無法初始化懶洋洋地收集
org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/jsp/index.jsp at line 19
16: }
17: */
18: User user = (User)request.getAttribute("list");
19: out.print(user.getLogin() + " : " + user.getPassword() + " : " + user.getUserRole());
20: %>
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.myproject.User.userRole, could not initialize proxy - no Session
org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:575)
org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:214)
org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:554)
org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:142)
org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:316)
java.lang.String.valueOf(String.java:2847)
java.lang.StringBuilder.append(StringBuilder.java:128)
org.apache.jsp.WEB_002dINF.jsp.index_jsp._jspService(index_jsp.java:90)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
這裏我註解類時:
@Entity
@Table(name="users")
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String login;
private String password;
private String email;
private boolean enabled;
private Set<UserRole> userRole = new HashSet<UserRole>(0);
public User(){}
public User(String login, String password, String email, boolean enabled){
this.login = login;
this.password = password;
this.email = email;
this.enabled = enabled;
}
public User(String login, String password, String email, boolean enabled, Set<UserRole> userRole){
this.login = login;
this.password = password;
this.email = email;
this.enabled = enabled;
this.userRole = userRole;
}
@Id
@Column(name="login", unique=true, nullable=false, length = 50)
public String getLogin(){
return this.login;
}
public void setLogin(String login){
this.login = login;
}
@Column(name="password", nullable = false, length = 50)
public String getPassword(){
return this.password;
}
public void setPassword(String password){
this.password = password;
}
@Column(name = "email", nullable = false, length = 100)
public String getEmail(){
return this.email;
}
public void setEmail(String email){
this.email = email;
}
@Column(name = "enabled", nullable = false)
public boolean isEnabled(){
return this.enabled;
}
public void setEnabled(boolean enabled){
this.enabled = enabled;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
public Set<UserRole> getUserRole(){
return this.userRole;
}
public void setUserRole(Set<UserRole> userRole){
this.userRole = userRole;
}
}
@Entity
@Table(name="user_roles", uniqueConstraints = @UniqueConstraint(columnNames = {"role","login"}))
public class UserRole implements Serializable{
private static final long serialVersionUID = 1L;
private int roleId;
private User user;
private String role;
public UserRole(){}
public UserRole(User user, String role){
this.user = user;
this.role = role;
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "role_id", unique = true, nullable = false)
public int getRoleId(){
return this.roleId;
}
public void setRoleId(int roleId){
this.roleId = roleId;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "login", nullable = false)
public User getUser(){
return this.user;
}
public void setUser(User user){
this.user = user;
}
@Column(name = "role", nullable = false)
public String getRole(){
return this.role;
}
public void setRole(String role){
this.role = role;
}
}
,並結束我的DAO:
@Override
@Transactional
@SuppressWarnings("unchecked")
public User findByLogin(String login){
String query = "from User where login = ?";
List<User> listUser = sessionFactory.getCurrentSession().createQuery(query).setParameter(0, login).list();
if(listUser.size() > 0)
return listUser.get(0);
else
return null;
}
必須在沒有user.getUserRole()的情況下標記jsp,但是當我新插入此方法代碼段時,我看到錯誤試。同樣在這個項目中實現了SpringSecurity,但是沒有工作「登錄」。我想同樣的
您的集合的集合是懶惰牽強。在檢索User後,你的休眠會話消失了,所以沒辦法懶惰地獲得集合。 (因爲例外也告訴你)。既可以讓你的集合被急切地提取,也可以使用'OpenSessionInViewFilter',或者創建一個特定的HQL來強制檢索這個屏幕的角色集合。 –