Java 如何获得Eclipselink实体管理器?

Java 如何获得Eclipselink实体管理器?,java,jpa,orm,eclipselink,Java,Jpa,Orm,Eclipselink,我正在从事一个C/S java项目,并尝试使用Eclipselink来实现ORM(客户端缓存数据库,derby)。 使用示例和表达式进行查询非常容易,但是当涉及到插入/更新时,我发现应该使用实体管理器(我对java ORM很陌生,也许还有其他方法?)。 当我尝试创建em时,它总是抛出一个异常,告诉我需要一个服务器会话(即,无法通过名称找到持久性单元)。 当我使用会话bean&@PersistenceUnit注释时,它返回空值 我犯了一些愚蠢的错误吗?或者有没有简单的方法来更新/插入值?我想可能有

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

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

编辑:我尝试使用UnitOfWork,但出现“尝试修改标识列”错误,我是否应该更改映射文件或使Eclipselink识别标识PK的内容

@GeneratedValue(策略=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>

org.eclipse.persistence.jpa.PersistenceProvider
java:/app/jdbc/jdbc/ConnectionDerbyDS
当您在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要使用哪个持久性提供程序,以及数据库的连接参数是什么

持久性单元名称(
“我的应用程序”
在上面的示例中)必须与
persistence.xml
中的
持久性单元
元素中指定的名称相同

请参阅,它显示了
persistence.xml
的外观

EntityManager
包含一些方法,如
persist(Object)
,您可以使用这些方法将实体保存到数据库中(请参见演示如何使用
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
是您在使用较旧的JPA1.0API时需要的东西;JPA2.0不需要这个):


javax.persistence.PersistenceException:EntityManager没有持久化提供程序名为my app name:provider名为org.eclipse.persistence.jpa.PersistenceProvider在创建EntityManager工厂时引发了意外异常:org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
@MikeZTM您有所有必要的配置吗类路径中的库?另外,不要在Java SE应用程序中的
persistence.xml
中使用
jta数据源,只需指定JDBC连接参数(请参阅)。我已经使用了javax.persistence.JDBC(这个persistence.xml是由Toplink编辑器自动生成的)。类路径似乎正确(JDBC驱动程序运行良好且“org.eclipse.presistence”类是JDeveloper自动配置的)我查看了Eclipsewiki上的示例,它建议使用工作单元来执行插入/更新。我尝试了它,更新效果很好,但是insert在标识列中有一些问题。我应该为此发布一个新问题(还是编辑这个问题)?
entityManager.getTransaction().begin();
entityManager.persist(myEntity);
entityManager.getTransaction().commit();