Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 带有java.util.Date字段的意外EclipseLink共享缓存行为_Jpa_Eclipselink_Shared Cache - Fatal编程技术网

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

Jpa 带有java.util.Date字段的意外EclipseLink共享缓存行为,jpa,eclipselink,shared-cache,Jpa,Eclipselink,Shared Cache,我在EclipseLink(2.3.0)上踢轮胎,发现了一些似乎严重错误的东西。我的问题在于,当一个实体从共享缓存命中返回时,java.util.Date(可能还有其他)并没有像我所期望的那样被复制。这会产生一些非常恶劣的后果,因为日期字段不是一成不变的,因此无法共享。。。。但也许我又错过了什么?我会注意到我没有任何属性集,但是我在JSE环境中使用了-javaagentweaver 测试代码段: // Setup EntityManager em = emf.createEntityManage

我在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文档中有描述:

简短回答:大多数非序列化的基础被视为不可变的,但可以使用EclipseLink@mutable注释将其配置为可变的:

哇!这完全违反直觉,没有多大意义。更糟糕的是,我的应用程序在启用缓存和禁用缓存时的行为有所不同?!大概然而,从ORM来看,跟踪更改是昂贵的。如果日期是不可变的,则效率更高,因为很难判断日期内部何时更改,否则-当属性内部发生更改时,无法使用属性更改跟踪。比较可以使用“==”并设置缓存对象中的值,如果该值不可变,则可以使用“=”。在没有共享缓存的情况下,多次读取对象意味着每次都会获得一个新的实例——使用它们自己的日期实例。共享缓存重用同一个实例及其日期对象。那么你是说性能比遵循文档化的API(日期和日历)更重要?在我看来,改变系统中对象的定义(可变与不可变)以更好地支持另一个实现中的缺陷是100%错误的答案。我真的被缓存与无缓存有不同行为的可能性所困扰。谢谢你的链接!