【问题标题】:entity manager merge(), then refresh实体管理器合并(),然后刷新
【发布时间】:2015-06-14 10:27:54
【问题描述】:

我很难使用实体管理器和合并功能。

我有一个 MySQL 数据库,其中包含一个用户表,该表有一个触发器。当您更新(或插入)用户时,触发器会创建一个随机盐,然后 SHA1 密码 + 盐。

当我想更新用户时会出现问题。在我的 servlet 中,我调用我的 SessionBean 方法 updateUser(User u),它只包含一个 return em.merge(u)

当我调试时,我查看了新密码,它不是 SHA1 的,它看起来很清楚(但它被修改了)。在数据库中,密码是 SHA1 并生成了盐,但不在应用程序中。

我的问题是,我该怎么做才能刷新我的用户并将他的密码设置为新密码? 我找到的唯一解决方案是重启应用程序,但是一点都不方便,我无法部署需要重启的解决方案......

PS : 我试过flush(),我不能做事务,我正在使用NetBeans(自动生成的类和SessionBeans),我正在学习Java EE,所以我没有那么多知识。我也尝试在用户修改后从数据库中获取用户,但密码仍然清晰。

【问题讨论】:

    标签: jakarta-ee jpa merge entitymanager


    【解决方案1】:

    entityManager 具有refresh 功能,可以将您的实体状态刷新为状态表单 DB。此外,您可以在您的 persistence.xml 文件中配置捕获模式:specifying the Cache Mode Settings to Improve Performance 到适合您的模式。

    【讨论】:

    • 我尝试了刷新,它告诉我一个错误Can not refresh not managed object: Classes.Utilisateur[ idUtilisateur=4 ]。我发现这是由于使用了多个实体管理器造成的,但我只使用了一个。
    • 您只能使用EntityManager 的一个CLASS,但可以使用该类的不同INSTANCE。刷新实体的 EntityManager 实例应该是从数据库加载它的实例。
    • 问题是我只使用了实体管理器的一个实例。我的代码是em.merge(u);,后跟em.refresh(u);,我不知道为什么它不想工作(EJBException)
    • 这个 EnitytManager 是否也会从 DB 中加载您的实体?你如何实例化你的EntityManager?你是通过@PersistenceContext 注入的吗?
    • 是的,这个实体从数据库加载我的用户(使用命名查询),它由 SessionBean 中的@PersistenceContext(unitName = "PortailPU") private EntityManager em; 实例化,我只实例化这个 SessionBean 一次并调用一个只包含 @ 的函数987654328@(u为对象参数)
    猜你喜欢
    • 1970-01-01
    • 2016-02-10
    • 2020-11-07
    • 2012-03-14
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多