EntityManager 可以读取数据但不会持久化更改

如何解决EntityManager 可以读取数据但不会持久化更改

我们使用基于 org.jboss.security.auth.spi.UsernamePasswordLoginModule自定义登录模块对 JBoss 服务器上的用户进行身份验证。登录凭据存储在数据库中,将由在 EntityManager 对象上运行的命名查询读取。

现在我想在每次用户登录时记录数据(例如登录时间)。但是,user 对象永远不会持久化。我不明白为什么阅读效果很好,而写作似乎是不可能的。加上没有错误数据库只是没有更新。

我尝试了很多变体,简单地设置属性并依靠容器来持久化我的更改,而且还自己设置一个事务并处理所有提交和回滚操作。我还尝试了 @Inject@Transactional@PersistenceContext 的各种组合来初始化 EntityManager 对象。

这些是我的登录控制器的相关部分(读取数据工作正常):

public class MyLoginModule extends UsernamePasswordLoginModule {
   private EntityManager em;
   private MyUserObject user;

   // ...

   @Override
   protected boolean validatePassword(String password,String expected) {
      // Validate credentials...

      try {
         user.setLastLogin(new Date()); // This does not persist!
      }
      catch (Exception e) {
         logError("Exception: " + e.getMessage());
      }

      return validated;
   }

   @Override
   public void initialize(Subject subject,CallbackHandler callbackHandler,Map sharedState,Map options) {
      super.initialize(subject,callbackHandler,sharedState,options);
      InitialContext ctx;

      try {
         ctx = new InitialContext();
         EntityManagerFactory factory = (EntityManagerFactory)ctx.lookup("java:jboss/foobarJndiName");
         em = factory.createEntityManager();

         // ...
      }
      catch (Exception e) {
         logError("Exception: " + e.getMessage());
      }
   }
}

这是我的 persistence.xml 文件内容

<persistence-unit name="foobar" transaction-type="JTA">
  <jta-data-source>java:jboss/datasources/MyFoobarDS</jta-data-source>
  <properties>
    <property name="jboss.entity.manager.factory.jndi.name" value="java:jboss/foobarJndiName" />

    <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
    <property name="hibernate.hbm2ddl.auto" value="none" />
    <property name="hibernate.show_sql" value="false" />
    <property name="hibernate.format_sql" value="false" />
    <property name="hibernate.use_sql_comments" value="false" />
  </properties>
</persistence-unit>

我阅读了 this article,这对理解 RESOURCE_LOCALJTA间的区别很有帮助。但是,到目前为止我还没有成功。要么什么也没发生,要么我得到了一些模糊的异常,例如 JTA 类型无法进行事务管理,等等...

我对 JBoss 内部结构不是很熟悉,但据我所知,我的登录控制器甚至不是容器管理的 bean。因此 @Inject@PersistenceContext 不起作用。但我不知道如何将我的登录控制器变成一个 bean,如果这是你在这种情况下想要做的事情。

长话短说:如何让我的 EntityManager 持久化更改,而不仅仅是读取数据?

我的数据源在其他类中工作正常(正确的 bean?)。在我的服务中,我可以按预期读取和写入数据。但是,@Inject@PersistenceContext 用于设置 EntityManager。我不知道为什么这里使用了 lookup()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?