【问题标题】:How to get Eclipselink Entity Manager?如何获取 Eclipselink 实体管理器?
【发布时间】:2011-11-22 02:38:00
【问题描述】:

我正在开发一个 C/S java 项目并尝试使用 Eclipselink 来执行 ORM(客户端缓存数据库,derby)。 使用示例和表达式进行查询非常容易,但是在插入/更新时,我发现应该使用实体管理器(我在 java ORM 中很新,也许还有另一种方法?)。 当我尝试创建 em 时,它总是抛出一个异常,告诉我我需要一个服务器会话(即无法按名称找到持久性单元)。 当我使用会话 bean 和 @PersistenceUnit 注释时,它返回 Null。

我犯了一些愚蠢的错误吗?或者有没有简单的方法来更新/插入值?我认为可能有一些方法,如 session.save(Object) 或类似的方法可以使这项工作变得简单。

编辑:我尝试使用 UnitOfWork,但出现“尝试修改身份列”错误,我应该更改地图文件还是让 Eclipselink 识别身份 PK 的东西?

@GeneratedValue(strategy = GenerationType.IDENTITY)

在 POJO 中添加这一行不起作用。

编辑:我尝试使用工作单元在此处插入值,这是代码

    SessionFactory sessionFactory = new SessionFactory("default");
    Session session = sessionFactory.getSharedSession();
    UnitOfWork uow = session.acquireUnitOfWork();
    SysUser usr2 = new SysUser();
    usr2.setUserName("test");
    usr2.setUserPassword("test");
    uow.registerObject(usr2);
    uow.commit();

但它会导致

Internal Exception: java.sql.SQLSyntaxErrorException: Attempt to modify an identity column 'DB_ID'.

这是我使用的注释:

@Column(name = "DB_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
protected int dbId;

对于 EntityManager:

<persistence-unit name="my-app-name">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>java:/app/jdbc/jdbc/ConnectionDerbyDS</jta-data-source>

【问题讨论】:

    标签: java jpa orm eclipselink


    【解决方案1】:

    当您在 Java SE 应用程序中使用 EclipseLink(通过 JPA API)时,与当您的应用程序包含在 Java EE 容器中运行的组件时,您必须进行一些不同的设置。

    你会得到一个EntityManager,其中包含如下行:

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-app");
    EntityManager em = emf.createEntityManager();
    

    并且您的应用程序需要在您的应用程序的 JAR 文件的 META-INF 目录中有一个 persistence.xml 文件。您在此文件中配置 JPA;你放在那里的东西告诉 Java 要使用哪个持久性提供程序以及你的数据库的连接参数是什么。

    持久性单元名称(上例中的"my-app")必须与persistence.xmlpersistence-unit 元素中指定的名称相同。

    查看this EclipseLink example,它显示了您的persistence.xml 的外观。

    EntityManager 包含诸如persist(Object) 之类的方法,您可以使用这些方法将实体保存到数据库中(请参阅these examples,它展示了如何使用EntityManager)。

    您的实体 POJO 应该有一个包含实体 id 的列,并且它必须有一个无参数构造函数:

    @Entity
    public class Example {
    
        @Id
        @GeneratedValue
        private long id;
    
        // ... Add other properties here
    
        // Required no-args constructor
        public Example() {
        }
    
        // ... Add getters and setters here
    }
    

    加法

    您可以使用EntityManager 将实体保存在数据库中,如下面的代码所示。无需使用UnitOfWork(据我所知,UnitOfWork 是您在使用较旧的 JPA 1.0 API 时需要的东西;对于 JPA 2.0,您不需要它):

    entityManager.getTransaction().begin();
    entityManager.persist(myEntity);
    entityManager.getTransaction().commit();
    

    【讨论】:

    • javax.persistence.PersistenceException: No Persistence provider for EntityManager named my-app-name: Provider named org.eclipse.persistence.jpa.PersistenceProvider threw unexpected exception at create EntityManagerFactory: org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
    • @MikeZTM 你的类路径中有所有必要的库吗?
    • 另外,不要在 Java SE 应用程序中的 persistence.xml 中使用 jta-data-source - 只需指定 JDBC 连接参数(请参阅 the example)。
    • 我已经使用了 javax.persistence.jdbc(这个 persistence.xml 是由 Toplink 编辑器自动生成的)。Classpath 似乎是正确的(JDBC 驱动程序运行良好,并且“org.eclipse.presistence”类是自动的由 JDeveloper 配置)
    • 我检查了 Eclipsewiki 上的示例,它建议使用 Unit of Work 进行插入/更新。我试过了,更新效果很好,但是插入的 IDENTITY 列有一些问题。我应该为此发布一个新问题(或者只是编辑这个问题)?
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 2014-07-22
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2014-01-09
    • 2012-06-28
    相关资源
    最近更新 更多