gpt4 book ai didi

java - EntityManager 不坚持合并,当刷新时我得到一个无法初始化代理 - 没有抛出 session

转载 作者:行者123 更新时间:2023-12-01 15:22:02 25 4
gpt4 key购买 nike

我的应用程序是用 Seam(2.2.1.CR2) 编写的,在最近的更新中,我为我的用户实体实现了一个名为点的字段。该字段应该保存从许多其他字段和操作聚合的点,因此,由于我有一个包含大量用户的数据库,我认为动态更新这些用户将是一个好主意。我通过将 User 实体中的新列分配给 -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;
}
}

然后我创建了一个pointBean:

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

我可能在这里遗漏了一些重要的东西。我做错了什么?

//雅各布

最佳答案

可能 user 变量是在旧 session 中从数据库中检索的,该 session 已经关闭,因此当您调用 user.getAppreciateFlags(); 时,这可能是LAZY 数据库引用,它尝试从数据库中检索它们,并且由于 session 已关闭,因此会发生该错误。

一个快速修复(不确定是否是最好的)是在 getAppeciateFlags 调用之前将用户合并到 session 中,因此代码将是:

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

关于java - EntityManager 不坚持合并,当刷新时我得到一个无法初始化代理 - 没有抛出 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10755826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com