2012-05-25 2 views
0

내 응용 프로그램이 Seam (2.2.1.CR2)로 작성되었으며 최근 업데이트에서 my 사용자 엔티티. 이 필드는 수많은 다른 필드와 작업에서 수집 된 점수를 보유해야하므로 사용자 수가 많은 데이터베이스가 있으므로이 사용자를 즉시 ​​업데이트하는 것이 좋습니다. 사용자 엔티티에 새 열을 -1로 지정하고 getPoints를 호출 할 때마다 한 번만 이벤트를 던지고 점을 업데이트하여이 작업을 수행했습니다.EntityManager가 병합을 유지하지 못하고 플러시 될 때 프록시를 초기화 할 수 없음 - 세션이 발생하지 않음

@Entity(name = "User") 
public class User { 

@Column(nullable = false, columnDefinition = "int(11) default -1") 
    private int points; 

public int getPoints() { 
     if (points == -1) { 
      Events.instance().raiseEvent(AppreciatedInitialUpdate.EVENT_NAME, this); 
     } 
     return points; 
    } 
} 

나는 다음 pointsBean 생성 :

@Name("pointsBean")  
@AutoCreate 
public class PointsBean implements Serializable, AppreciatedInitialUpdate { 

    @Logger 
    private Log log; 

    @In 
    EntityManager entityManager 

    @Observer(AppreciatedInitialUpdate.EVENT_NAME) 
    public void handleAppreciatedInitialUpdate(User User) { 
     this.calculateInitialPoints(user); 
    } 

    private void calculateInitialPoints(User user) { 

     int likes = 0; 

     List<Flag> appreciateFlags = user.getAppreciateFlags(); 
     likes = appreciateFlags.size(); 

     user.setLikes(likes); 
     entityManager.merge(user); 
     log.info("Initial update of points for user " + user.getId() + ". Now he/she has " + points); 
    }   
} 

하지만 내 타이틀 상태로

는 엔티티가 유지되지 않습니다 같은 일을하고 난 후 세척하면 내가 예외 얻을 :

[org.hibernate.LazyInitializationException] could not initialize proxy - no Session 
org.hibernate.LazyInitializationException: could not initialize proxy - no Session 
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:62) 
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:116) 
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:166) 

나는 여기서 중요한 무엇인가를 놓친다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

// 야콥 아마 user 변수가 이전 세션에서 데이터베이스에서 검색 한

답변

1

, 즉 이미 폐쇄되었다, 그래서 당신은 user.getAppreciateFlags();를 호출 할 때, 즉 아마 LAZY 데이터베이스 참조입니다, 그것은 그들을 검색하려고 시도 데이터베이스가 닫히고 세션이 닫히기 때문에 오류가 발생합니다.

한 빠른 수정, 코드가 될 것입니다, 그래서 getAppeciateFlags 호출하기 전에 세션에서 사용자를 병합하는 것입니다 (그 최고의 하나 확실하지)의 경우와

entityManager.merge(user); 
List<Flag> appreciateFlags = user.getAppreciateFlags(); 
likes = appreciateFlags.size(); 
user.setLikes(likes); 
+0

그래입니다. 실제로 entityManager.refresh (사용자); 나를 올바른 방향으로 가리켜 주셔서 감사합니다. – jakob

관련 문제