我的应用程序是用Seam(2.2.1.CR2)编写的,在最近的更新中,我为我的用户实体实现了一个名为points的字段。这个字段应该包含从许多其他字段和操作聚合的点,因此,由于我有一个包含大量用户的数据库,我认为即时更新这些用户将是一个好主意。我这样做是通过将User实体中的新列指定为-1,然后每当调用getPoints时抛出一个Event并更新点,但只有一次。
@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
答案 0 :(得分:1)
可能在较早的会话中从数据库中检索到user
变量,该会话已经关闭,因此当您调用user.getAppreciateFlags();
时,这可能是一个LAZY数据库引用,它会尝试从数据库,并且自会话关闭以来,就会发生错误。
一个快速修复(不确定它是否是最好的)是在getAppeciateFlags
调用之前合并会话中的用户,因此代码将是:
entityManager.merge(user);
List<Flag> appreciateFlags = user.getAppreciateFlags();
likes = appreciateFlags.size();
user.setLikes(likes);