Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EntityManager未使用merge持久化,刷新时无法初始化代理-未引发任何会话_Java_Hibernate_Seam2 - Fatal编程技术网

Java EntityManager未使用merge持久化,刷新时无法初始化代理-未引发任何会话

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

我的应用程序是用Seam(2.2.1.CR2)编写的,在最近的一次更新中,我为我的用户实体实现了一个名为points的字段。这个字段应该包含许多其他字段和操作的聚合点,因此,由于我有一个拥有大量用户的数据库,我认为动态更新这些用户将是一个好主意。为此,我将用户实体中的新列指定为-1,然后每当调用getPoints时抛出事件并更新点,但只更新一次

@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);