【发布时间】:2010-03-16 22:04:11
【问题描述】:
我的“HelloJPA”代码(如下)试图将员工存储在数据存储中。但是,在提交(本地资源)事务后,任何读取持久对象的尝试都会得到“IllegalStateException”的奖励:
Employee employee = ...
EntityManagerFactory factory =
Persistence.createEntityManagerFactory( "HelloJPA", System.getProperties() );
EntityManager manager = factory.createEntityManager();
EntityTransaction transaction = manager.getTransaction();
try {
transaction.begin();
manager.persist( employee );
transaction.commit();
} finally {
if (transaction.isActive()) {
transaction.rollback();
}
manager.close();
}
System.out.println("Employee id == " + employee.getId() ); //<< IllegalStateException
好吧,我猜,经理占有了我新分配的员工对象,一旦我提交事务,它就变得不可用。但是,实现这个简单操作的常见习惯用法是什么,即,将一个对象一直写入数据存储,同时仍然保持对它的只读访问?文档(教程或 API 参考)没有专门解决这个问题,我发现使用资源本地事务的代码示例似乎在提交后从未尝试读取对象......但肯定有一个非常简单的方法做吗??
在此先感谢您提供任何帮助/指点!
【问题讨论】:
-
首先,创建的员工真的被持久化到数据库了吗?其次,您的员工实体是什么样的?在资源本地 tran 提交后使用实体是一种有效的做法。
-
嗨,瑞克,谢谢您的评论。是的,员工被添加到数据存储中。当然,这是一个玩具示例,因此“员工”看起来非常简单:@Entity public class Employee implements Serializable { private static final long serialVersionUID = ...; @Id 私有字符串 id; @Basic 私有字符串名称; @Basic 私有字符串位置; // getter 和 setter 省略 } 这有帮助吗?提前致谢!
-
你能发布 IllegalStateException 吗?里克说得对,这应该可行。
-
你能不能也展示一下你的Employee类?