2012-05-25 2 views
0

Мое приложение написано в Seam (2.2.1.CR2), и в недавнем обновлении я применил поле, называемое точками для моего Пользовательский объект. Это поле должно содержать точки, объединенные из множества других полей и действий, поэтому, поскольку у меня есть база данных с множеством пользователей, я думал, что обновление этих пользователей «на лету» будет хорошей идеей. Я сделал это, назначив новый столбец в объекте User равным -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) 

У меня, наверное, отсутствует что-то важное здесь. Что я делаю не так?

// Jakob

ответ

1

Возможно переменная user была извлечена из базы данных в старой сессии, которая была уже закрыта, так что, когда вы звоните user.getAppreciateFlags();, что, вероятно, является LAZY справочной базы данных, он пытается извлечь их из базы данных, и поскольку сеанс закрыт, эта ошибка возникает.

Одно быстрое решение (не уверен, что его лучший), чтобы объединить пользователя в сеансе перед getAppeciateFlags вызова, так что код будет:

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

Yup, что был случай. Я фактически сделал entityManager.refresh (пользователь); Спасибо, что указал мне в правильном направлении. – jakob

Смежные вопросы