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

时间:2012-10-11 14:31:42

标签: jpa eclipselink shared-cache

我在EclipseLink(2.3.0)上踢了一脚,发现了一些看似严重错误的东西。我的问题是,当从共享缓存命中返回实体时,java.util.Date(可能还有其他)不会像我期望的那样被复制。这有一些非常令人讨厌的后果,因为Date字段不是不可变的,因此无法共享....但是,那么我可能会遗漏一些东西?我会注意到我没有设置任何属性,但我在JSE环境中使用-javaagent编织器。

测试片段:

// 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

1 个答案:

答案 0 :(得分:0)

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

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