Java EntityManager未使用merge持久化,刷新时无法初始化代理-未引发任何会话
我的应用程序是用Seam(2.2.1.CR2)编写的,在最近的一次更新中,我为我的用户实体实现了一个名为points的字段。这个字段应该包含许多其他字段和操作的聚合点,因此,由于我有一个拥有大量用户的数据库,我认为动态更新这些用户将是一个好主意。为此,我将用户实体中的新列指定为-1,然后每当调用getPoints时抛出事件并更新点,但只更新一次Java EntityManager未使用merge持久化,刷新时无法初始化代理-未引发任何会话,java,hibernate,seam2,Java,Hibernate,Seam2,我的应用程序是用Seam(2.2.1.CR2)编写的,在最近的一次更新中,我为我的用户实体实现了一个名为points的字段。这个字段应该包含许多其他字段和操作的聚合点,因此,由于我有一个拥有大量用户的数据库,我认为动态更新这些用户将是一个好主意。为此,我将用户实体中的新列指定为-1,然后每当调用getPoints时抛出事件并更新点,但只更新一次 @Entity(name = "User") public class User { @Column(nullable = false, column
@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);
}
}
我可能错过了一些重要的东西。我做错了什么
//Jakob可能
user
变量是在较旧的会话中从数据库中检索的,该会话已关闭,因此当调用user.getApprovateFlags()时代码>,这可能是一个懒惰的数据库引用,它尝试从数据库中检索它们,由于会话已关闭,因此会发生错误
一个快速解决方案(不确定是否是最佳解决方案)是在getAppeateFlags
调用之前将会话中的用户合并,因此代码如下:
entityManager.merge(user);
List<Flag> appreciateFlags = user.getAppreciateFlags();
likes = appreciateFlags.size();
user.setLikes(likes);
entityManager.merge(用户);
List approvateflags=user.getapprovateflags();
likes=可观的lags.size();
user.setLikes(likes);
是的,就是这样。我实际上做了一个entityManager.refresh(user);谢谢你给我指明了正确的方向。
entityManager.merge(user);
List<Flag> appreciateFlags = user.getAppreciateFlags();
likes = appreciateFlags.size();
user.setLikes(likes);