Tag: eclipselink

JPA:如何自动生成影子表(历史记录)

我正在使用EclipseLink的历史记录function 。 据我所知,目前还没有实际创建影子表的支持 。 我正在为所有基表使用JPA 2.1自动化模式生成。 工作良好。 现在我正在寻找一种自动化创建影子表的方法。 对于每个基表,应该有一个带有一些额外列的影子表。 否则,影子表具有正在遮蔽的表的确切结构。 我在模型中有超过50个实体,并且在其中抛出了一些多对多关系,所有映射到大约55个物理表。 我不想为所有影子表维护DDL创建脚本。 现在该项目与数据库无关(至少对于通常的嫌疑人而言),我想保持这种方式。 绑定到EclipseLink不是问题所以EclipseLink特定的解决方案是可以的。 那么,如何创建影子表呢? 可以使用子类来表示每个历史表。 假设基类是Car ,那么: @Entity @Table(name=”CAR_HIST”) public class ClassHist extends Car { … // some extra audit fields here } 并且在Car上使用@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)注释它实际上将使用JPA模式生成来完成工作。 所以,几乎就是这样。 除了没有实体的多对多关系表,我可以得到实际操作,因此无法获得为关系表生成的影子表。 UPDATE 原来使用inheritance来创建影子表并不是一个好主意。 原因是JPA JPQL查询是多态的 。 这意味着像SELECT a FROM Car这样的查询实际上也会进入CAR_HIST表,因为CarHist只是Car一个子类。 从这些表中获取SELECT的UNION。 显然不想要我想要。 它不是一个好主意的另一个原因是用于历史的子类将inheritance其父级的主键。 这也是完全错误的。 更新2 我发现EclipseLink中有这个function的RFE 。

JPA:从属性创建EntityManagerFactory

我在JAR-Project中使用JPA并使用persistence.xml来设置我的EntityManager。 但是由于persistence.xml在构建之后位于JAR内部,因此用户之后更改设置非常复杂。 所以我正在寻找一个解决方案,我可以通过在运行时加载的属性文件配置我的连接。 我在网上遇到了这个解决方案: Map properties = new HashMap(); // Configure the internal EclipseLink connection pool properties.put(JDBC_DRIVER, “oracle.jdbc.OracleDriver”); properties.put(JDBC_URL, “jdbc:oracle:thin:@localhost:1521:ORCL”); properties.put(JDBC_USER, “user-name”); properties.put(JDBC_PASSWORD, “password”); Persistence.createEntityManagerFactory(“unit-name”, properties); 这是我正在寻找的解决方案,但我在这里缺少一件事:在我的persistence.xml中,我还在映射文件上声明了一个模式名称: persistence.xml中: org.eclipse.persistence.jpa.PersistenceProvider … true META-INF/orm.xml orm.xml中: SCHEMA_NAME 所以我的问题基本上是:我是否可以使用在运行时设置架构的属性,就像我对其他属性一样? 或者甚至有更好的解决方案? 提前致谢!

禁用JPA EclipseLink 2.4缓存

我正在尝试禁用EclipseLink 2.4缓存,因此如果其他应用程序在数据库中更改了数据,则在我的应用程序中刷新相同的数据,使用EclipseLink 2.4,而不重新启动它。 这些属性似乎都不起作用: NONE … 帮助的唯一选择是: typedQuery.setHint(QueryHints.REFRESH, HintValues.TRUE); 但这对我来说不是一个选项,因为现在该应用程序已编写,我不想搜索所有查询或em.find()方法并将此提示放入。 编辑1:此处描述了类似的问题: http : //eclipse.1072660.n5.nabble.com/Notifications-about-external-database-changes-td5389.html 编辑2:总结一下,我希望所有查询和查找调用都会刷新从数据库中获取的数据。

检索JPA实体列表和元数据

我想知道是否有办法在JPA中获取特定持久单元的所有实体类及其元数据。 通过元数据,我不仅指字段,还指它们的列名,长度,精度,数据类型,以及表名和我可以获得的任何内容。 我尝试使用元模型,但我认为仅仅针对JPQL查询。 我需要能够向用户显示某些PU的所有活动实体,并且我不想在某些数组或数据库中对它们进行硬编码,我希望API告诉我它有什么实体。 而且,如果可能的话,获取每个实体的托管实例。 我想我可以尝试使用reflection来获取带有@Entity注释的所有类,但它不会很漂亮,并且更难以知道哪个类属于特定的PU,所以如果api已经暴露了这个信息,那么它将是大。 我更喜欢符合JPA的解决方案,但如果不可能,Hibernate或EclipseLink特定的答案就可以做到。 谢谢!

如何在JPA中按count()订购

我正在使用这个JPA-Query: SELECT DISTINCT e.label FROM Entity e GROUP BY e.label ORDER BY COUNT(e.label) DESC 我没有得到任何错误,结果几乎是正确的,但是有些值是错误的(要么翻转两个值,要么将一些值完全错位) 编辑: 将COUNT(e.label)添加到我的SELECT子句可以解决此查询的此问题。 但是在类似的查询中也包含WHERE子句,问题仍然存在: SELECT DISTINCT e.label, COUNT(e.label) FROM Entity e WHERE TYPE(e.cat) = :category GROUP BY e.label ORDER BY COUNT(e.label) DESC

如何使用EclipseLink和Spring配置动态编织?

如何使用EclipseLink和Spring配置动态编织? 现在我正在尝试使用Junit测试,但后来我必须让它与Tomcat一起工作(我的部门已经标准化了10年之久)。 我遇到两个主要问题: 1. Spring需要一个加载时间织布工: 例外: java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:181) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.context.weaving.AspectJWeavingEnabler#0’: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘loadTimeWeaver’: Initialization of bean failed; nested exception is java.lang.IllegalStateException: ClassLoader [sun.misc.Launcher$AppClassLoader] does NOT provide an ‘addTransformer(ClassFileTransformer)’ method. Specify […]

从JPA级别选择更新跳过锁定

在我的应用程序 – 带JPA的Oracle(EclipseLink)中,我使用以下表达式来锁定某些表中的记录子集: select * from MY_TABLE where MY_CONDITIONS for update skip locked 我在本机查询中运行它,但我必须为所有必需的实体编写该查询。 有没有办法使用纯JPA跳过锁定的记录? 我可以实施自己的锁定政策吗? 我不介意更改JPA提供程序,但我想使用JPA API。

是否应该在equals和hashCode中考虑JPA实体的id字段?

我在使用JPA2和EclipseLink编写数据库应用程序的测试时遇到了问题: 我将一些实体添加到数据库中,稍后检索它并希望将它与具有我期望确认添加按预期工作的值的实例进行比较。 首先我写了类似的东西 assertEquals(expResult, dbResult); 哪个失败了,因为我真的不知道id字段的值,它是由数据库生成的,因此dbResult与我用new和手动填充创建的dbResult不同。 我看到两个选择: 要么我从equals和hashCode删除id字段,以便比较仅基于“实际值”。 不过,我不知道这是否会导致数据库或其他地方出现问题。 或者我编写测试以手动显式检查除id之外的每个字段。 我该怎么办?

JPA Eclipselink数据库更改通知不会使缓存条目无效

我有两个使用Eclipselink 2.4.2进行持久化的Java 1.7应用程序。 一个应用程序是在Glassfish 3.1.2.2中运行的JEE应用程序,另一个是Java SE应用程序。 这些应用程序读取和写入相同的数据,因此可能存在过时的JPA缓存条目。 我试图使用Oracle DCN来解决过时的缓存问题。 我已经按照上面的链接中的描述配置了我的persistence.xml: org.eclipse.persistence.jpa.PersistenceProvider jdbc/DRMS 然而,我仍然得到陈旧的缓存条目。 如果一个应用程序提交对数据库的更改,则第二个应用程序仍会看到其旧的过时缓存条目,而不是新的更改。 使用调试器,我已经确认OracleChangeNotificationListener正在接收数据库事件,但它似乎永远不会使缓存中的任何内容无效。 Eclipselink OracleChangeNotificationListener注册以下侦听器以接收Oracle数据库更改事件: public void onDatabaseChangeNotification(DatabaseChangeEvent changeEvent) { databaseSession.log(SessionLog.FINEST, SessionLog.CONNECTION, “dcn_change_event”, changeEvent); if (changeEvent.getTableChangeDescription() != null) { for (TableChangeDescription tableChange : changeEvent.getTableChangeDescription()) { ClassDescriptor descriptor = OracleChangeNotificationListener.this.descriptorsByTable.get(new DatabaseTable(tableChange.getTableName())); if (descriptor != null) { CacheIndex index = descriptor.getCachePolicy().getCacheIndex(fields); for (RowChangeDescription rowChange : […]

以编程方式访问JPA

是否可以通过Java API访问的信息? MySchema 我想通过JPA API或EclipseLink API阅读模式“MySchema”,这是我使用的实现。 类似于:entityManager.getDefaults()。getSchema(); 可以投射或使用任何EclipseLink类,这对此很好。 谢谢