初学者问题:JPA 的基本插入习语?

Posted

技术标签:

【中文标题】初学者问题:JPA 的基本插入习语?【英文标题】:Beginner question: basic insertion idiom for JPA? 【发布时间】: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类? 【参考方案1】:

您的employee 在关闭实体管理器后变得分离,但没有任何东西禁止访问分离实体的Id 注释属性。 IOW,您的代码是正确的,并且适用于 Hibernate 和 EclipseLink。也许在 OpenJPA 的 Jira 中搜索现有问题或打开一个新问题。

【讨论】:

以上是关于初学者问题:JPA 的基本插入习语?的主要内容,如果未能解决你的问题,请参考以下文章

JPA:获取双向多对一关系

JPA 标准教程 [关闭]

带有两个子查询/连接的 JPA 标准选择

JPA 选择查询以返回带有 @ManyToOne 映射的实体

Linux初学

从一个简单的 JPA 示例开始