2010-11-24 4 views
3

Iam은 여전히 ​​lazyinitializationexception 예외가 발생합니다. 예, 저 또는 다른 사람이 컬렉션에 액세스하려고 시도하는 동안 세션이 닫혔다는 의미입니다. 아니요, OpenEntityManagerInViewFilter가 작동하지 않았습니다. 예, @ManyToOne (fetch = FetchType.EAGER) 도움이되었지만 사용하지 않으려 고합니다.fetch = FetchType.EAGER를 사용하지 않고 lazyinitializationexception을 푸는 방법?

그 밖의 방법은 무엇입니까?

P. : 주석 클래스가있는 jpa와 함께 HibernateEntityManger를 사용하고 있습니다. 사용자 (ID가, FIRST_NAME는, LAST_NAME은 이메일 ....) 역할 (ID는, 이름이 ... 코멘트) users_roles :

UPADATE 여기 먼저 모든 의 내가 4 개 테이블이, 내 코드입니다 (USER_ID, ROLE_ID)는 사용자가 mutiples 역할을 할 수

메일 (ID, USER_ID, 제목, 메시지, to_id ...) ... 사용자 엔티티

@Entity 
@Table(name = "USERS") 
public class User implements GenericDomain{ 

    public static final String _ID = "id"; 
private Long id; 
private String firstName; 
private String lastName; 
private String email; 
private Set<Role> roles = new HashSet<Role>(0); 

/* Constructors */ 
public User() { 
} 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name = "ID", unique = true, nullable = false) 
public Long getId() { return this.id; } 
public void setId(Long id) { this.id = id; } 

@Column(name="FIRST_NAME", nullable = false, length = 64) 
@NotEmpty 
@Length(min = 4, max = 45) 
public String getFirstName() { return this.firstName; } 
public void setFirstName(String firstname) { this.firstName = firstname; } 

@Column(name="LAST_NAME", nullable = false, length = 64) 
@NotEmpty 
@Length(min = 4, max = 45) 
public String getLastName() { return this.lastName; } 
public void setLastName(String lastname) { this.lastName = lastname; } 

@Column(name="EMAIL", unique = false, length = 64) 
@Email 
@NotEmpty 
@Length(min = 4, max = 45) 
public String getEmail() { return this.email; } 
public void setEmail(String email) { this.email = email; } 

@ManyToMany(fetch=FetchType.EAGER) 
@JoinTable(name = "USERS_ROLES" 
    , joinColumns = { @JoinColumn(name = "user_id") } 
    , inverseJoinColumns = { @JoinColumn(name = "role_id") } 
) 
public Set<Role> getRoles() { 
    return this.roles; 
} 
public void setRoles(Set<Role> roles) { 
    this.roles = roles; 
} 

/*@Override toString/equals/hascode */ 

}

,

역할 엔티티

@Entity 
@Table(name = "ROLES") 
public class Role implements GenericDomain { 
private Long id; 
private String name; 
private String comment; 
private Set<User> users = new HashSet<User>(0); 

public Role() { 
} 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name = "ID", unique = true, nullable = false) 
public Long getId() { return id; } 
public void setId(Long id) { this.id = id; } 

@Column(name="NAME", nullable = false, length = 64) 
@NotEmpty 
@Length(min = 1, max = 32) 
public String getName() { return name; } 
public void setName(String name) { this.name = name; } 

@Column(name="COMMENT", nullable = true, length = 256) 
@Length(min = 0, max = 255) 
public String getComment() { return this.comment; } 
public void setComment(String comment) { this.comment = comment;} 

@ManyToMany(cascade=CascadeType.REFRESH,fetch=FetchType.EAGER) 
@JoinTable(
    name = "USERS_ROLES" 
    , joinColumns = { @JoinColumn(name = "role_id") } 
    , inverseJoinColumns = { @JoinColumn(name = "user_id") } 
) 
public Set<User> getUsers() { 
    return this.users; 
} 
public void setUsers(Set<User> users) { 
    this.users = users; 
} 

/*@Override toString/equals/hascode */ 

}

메일

@Entity @Table (NAME = "메일") 공용 클래스 메일 {

private Long id; 
private String mailSubject; 
private String mailContent; 
private Long receiverId; 
private User user = null; 

public Mail(){ 
} 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "ID", nullable = false) 
public Long getId(){ return this.id; } 
public void setId(Long id){ this.id = id;} 

@Column(name = "MAILSUBJECT", nullable = false, length = 63) 
@Length(max = 63) 
public String getMailSubject(){ return this.mailSubject; } 
public void setMailSubject(String mailSubject){ this.mailSubject = mailSubject; } 

@Column(name = "MAILCONTENT", nullable = true, length = 255) 
@Length(max = 255) 
public String getMailContent(){ return this.mailContent; } 
public void setMailContent(String mailContent){ this.mailContent = mailContent; } 

@Column(name = "RECEIVERID") 
public Long getReceiverId(){ return this.receiverId; } 
public void setReceiverId(Long receiverId){ this.receiverId = receiverId; } 


@ManyToOne(fetch=FetchType.EAGER) 
@JoinColumn(name = "USER_ID") 
@NotNull 
public User getUser(){ return this.user; } 
public void setUser(User user){ this.user = user; } 
} 

사용자 컨트롤러

GenericDomain 구현 012 모든 것을 가지고있는 사용자

<select > 
<c:forEach items="${allRoles}" var="role"> 
    <option value="${role.id}" <c:if test="${fn:contains(roleSelected, role)}">selected="selected"</c:if> >${role.name}</option> 
</c:forEach> 
</select> 

에 대한 34,687,이

메일 컨트롤러

@Controller 
@SessionAttributes("mail") 
@RequestMapping("/portal/mail") 
public class MailController{ 

@Autowired 
private MailService mailService; 

@RequestMapping(value = "ajaxLoad", method = RequestMethod.GET) 
public @ResponseBody List<Mail> list(@RequestParam(value = "type", required = true) String type){ 
    return mailService.getUserMails((Long) WebHelper.getPrincipal().getUser().getId(),type); 
} 

}

내 web.xml을

<filter> 
    <filter-name>SpringOpenEntityManagerInViewFilter</filter-name> 
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>SpringOpenEntityManagerInViewFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

내 edit.jsp를, 내가 edit.jsp를 사용자가 lazy = false로 잘 작동하고 있습니다. FetchType.EAGER를 사용하여 내 메일을 가져올 수 없으므로 FetchType.EAGER없이 순환 스택으로 들어갑니다. 그 게으른 예외가 있습니다.

답변

2

모든 열망을 제거하고이 내 문제

<mvc:interceptors> 
    <bean class="org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 
</mvc:interceptors> 

필터 didnt 한 일

2

OpenEntityManagerInViewFilterOpenEntityManagerInViewInterceptor가 작동합니다. 너는 뭔가 잘못하고있다.

이외에도 Hibernate.initialize(..)을 사용하여 컬렉션을 초기화 할 수 있습니다. 그러나 이것을 수동으로하는 것은 바람직하지 않습니다. 필터/인터셉터가 작동하지 않는 이유에 대해 자세히 설명하십시오.

업데이트 : 필터를 패턴에 매핑하는 대신 디스패처 서블릿에 매핑하십시오.따라서 <url-pattern>을 지정하는 대신 <servlet-name>을 지정하십시오.

+0

안녕 Bozlo, 내 코드 –

+0

@stunaz에서 봐주십시오 해결 추가 - 업데이 트를 확인을. – Bozho

-2

우선 Set이 아닌 Collection이 필요한지 확인하십시오. 컬렉션 내의 개체가 고유 한 경우 LazyInitializationException으로 90 %의 문제를 해결하는 Set이라는 변수를 선언하십시오.

+1

안녕하세요, 내 게시물을 업데이 트하고 일부 코드를 넣어, 당신이 볼 수있는 컬렉션을 사용하지 말고, 나는 세트를 사용하지만, 게으른 예외는 여전히 거기에있다 –

관련 문제