我正在开发一个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>
答案 0 :(得分:8)
当您在Java SE应用程序中使用EclipseLink(通过JPA API)时,您需要设置一些与您的应用程序包含在Java EE容器中运行的组件时不同的东西。
你得到EntityManager
这样的行:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-app");
EntityManager em = emf.createEntityManager();
您的应用程序需要在应用程序的JAR文件的persistence.xml
目录中有一个META-INF
文件。您在此文件中配置JPA;你放在那里的东西告诉Java使用哪个持久性提供程序以及数据库的连接参数是什么。
持久性单元名称(上例中的"my-app"
)必须与persistence-unit
中persistence.xml
元素中指定的名称相同。
请参阅this EclipseLink example,其中显示了persistence.xml
的外观。
EntityManager
包含persist(Object)
等可用于将实体保存到数据库中的方法(请参阅these examples,了解如何使用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();