jpa - EclipseLink 与 java.util.Date 字段的意外共享缓存行为

标签 jpa eclipselink shared-cache

我在 EclipseLink(2.3.0) 上试了一下,发现了一些看起来很严重的错误。我的问题是,当从共享缓存命中返回实体时,java.util.Date(可能还有其他)没有像我期望的那样被复制。这会产生一些非常糟糕的后果,因为日期字段不是一成不变的,因此不能共享……但话又说回来,也许我遗漏了什么?我会注意到我没有设置任何属性,但我在 JSE 环境中使用 -javaagent weaver。

测试片段:

// Setup
EntityManager em = emf.createEntityManager();
Person p = new Person(2);
java.util.Date d = new java.util.Date();
p.setDate(d);

em.getTransaction().begin();
em.persist(p);
em.getTransaction().commit();
em.close();

// Get a fresh em
EntityManager em1 = emf.createEntityManager();

Person p1 = em1.find(Person.class, p.getId()); // cache hit
java.util.Date d1 = p1.getDate();

assertFalse(p == p1); // Make sure we have different entities
// The next line fails! For some odd reason different Entities are sharing the same date.
assertFalse(d == d1); // make sure each Entity instance has different date instances

最佳答案

这在 EclipseLink 文档中有描述: http://wiki.eclipse.org/Introduction_to_EclipseLink_Application_Development_(ELUG)#Mutability

简短的回答:大多数非序列化的 Basics 被视为不可变的,但可以使用 EclipseLink @Mutable 注释将其配置为可变的: http://eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_mutable.htm

关于jpa - EclipseLink 与 java.util.Date 字段的意外共享缓存行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12841998/

相关文章:

java - 错误 : 'No Persistence provider for EntityManager' under Hibernate 5. 3.0.Beta1

java - 根据 JPA 规范,实体类中必须有默认构造函数,为什么?

java - 当我运行程序时,JPA 不会在 MySQL 中创建表

caching - Windows Azure 角色内缓存与共享缓存

主站点之间的asp.net缓存共享添加其应用程序/虚拟目录(使用iis 7.5)

java - 关系实体用于在单个实体的对象之间创建层次结构

java - 属性(property)访问。 getter 中的逻辑

java - JPA继承查询(Eclipse Link)

java - oneToMany 连接时如何避免持久化新对象?