2010-03-16 59 views
2

我的“HelloJPA”代码(下面)尝试将Employee存储在数据存储中。然而,任何企图犯下(本地资源)的交易后读取持久化对象被奖励一个“IllegalStateException异常”:初学者问题:JPA的基本插入习惯用法?

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 

OK,我想,管理者占有了我的新分配的员工对象,它的一旦我进行交易就变得不可用。但是,那么实现这个简单操作的常见习惯用法是什么?即将对象一直写入数据存储区,同时仍保持只读访问权限?文档(教程或API参考)没有具体解决这个问题,并且我发现使用资源本地事务的代码示例在提交后似乎没有尝试读取对象...但肯定必须有一个简单的方法去做吧??

在此先感谢您的任何帮助/指针!

+0

首先,创建的员工是否确实坚持了DB?其次,你的员工实体是什么样的?在资源本地传输提交之后使用实体是一件有效的事情。 – Rick 2010-03-23 14:59:48

+0

嘿,里克,thx您的评论。 是的,员工被添加到数据存储。当然,这是一个玩具例子,让“员工”看起来简单的末端: @Entity 公共类员工实现Serializable { 私有静态最后的serialVersionUID长= ...; @Id private String id; @基本 私人字符串名称; @基本 私人字符串的位置; //吸尘器和吸尘器省略 } 这有帮助吗?提前致谢! – jucar 2010-03-25 18:03:05

+0

你能发布IllegalStateException吗?里克的权利,这应该工作。 – Mike 2010-04-02 01:46:10

回答

0

在关闭实体管理器后,您的employee变为分离,但没有任何内容禁止访问分离实体的Id注释属性。 IOW,你的代码是正确的,可以与Hibernate和EclipseLink一起使用。也许在OpenJPA的Jira中搜索现有的问题或者打开一个新的问题。