如何解决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-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_LOCAL
和 JTA
之间的区别很有帮助。但是,到目前为止我还没有成功。要么什么也没发生,要么我得到了一些模糊的异常,例如 JTA
类型无法进行事务管理,等等...
我对 JBoss 内部结构不是很熟悉,但据我所知,我的登录控制器甚至不是容器管理的 bean。因此 @Inject
和 @PersistenceContext
不起作用。但我不知道如何将我的登录控制器变成一个 bean,如果这是你在这种情况下想要做的事情。
长话短说:如何让我的 EntityManager
持久化更改,而不仅仅是读取数据?
我的数据源在其他类中工作正常(正确的 bean?)。在我的服务中,我可以按预期读取和写入数据。但是,@Inject
或 @PersistenceContext
用于设置 EntityManager
。我不知道为什么这里使用了 lookup()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。