0

私のアプリケーションは Seam(2.2.1.CR2) で書かれており、最近の更新で User エンティティの points と呼ばれるフィールドを実装しました。このフィールドには、他の多数のフィールドとアクションから集計されたポイントが保持されるはずです。そのため、大量のユーザーを含むデータベースがあるため、これらのユーザーをその場で更新することをお勧めします。これを行うには、User エンティティの新しい列を -1 に割り当て、getPoints が呼び出されるたびにイベントをスローしてポイントを更新しますが、1 回だけです。

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

私はおそらくここで決定的な何かを見逃しています。私は何を間違っていますか?

// ヤコブ

4

1 に答える 1

1

おそらくuser変数は、すでに閉じられている古いセッションでデータベースから取得されたため、user.getAppreciateFlags();おそらくLAZYデータベース参照であるを呼び出すと、データベースからそれらを取得しようとします。セッションが閉じられているため、そのエラーが発生します.

簡単な修正方法の 1 つ (最適かどうかは不明) は、getAppeciateFlags呼び出しの前にユーザーをセッションにマージすることです。そのため、コードは次のようになります。

entityManager.merge(user);
List<Flag> appreciateFlags = user.getAppreciateFlags();
likes = appreciateFlags.size();
user.setLikes(likes);
于 2012-05-25T14:26:41.003 に答える