繁体   English   中英

如何获得Eclipselink实体经理?

[英]How to get Eclipselink Entity Manager?

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

请参阅此EclipseLink示例 ,该示例显示了persistence.xml外观。

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

您的实体POJO应该有一个包含实体ID的列,并且它必须具有no-args构造函数:

@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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM