2012-10-11 74 views
3

我在EclipseLink(2.3.0)上踢輪胎,發現一些看起來嚴重錯誤的東西。我的問題的網絡是,當一個實體從共享緩存命中返回時,java.util.Date(也許是其他人)不會像我所期望的那樣被複制。這有一些相當不好的後果,因爲日期字段不是不可變的,因此不能共享....但是可能我又錯過了一些東西?我會注意到,我沒有設置任何屬性,但我在JSE環境中使用了織布工-javaagent使用java.util.Date字段的意外的EclipseLink共享緩存行爲

測試片段:

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

回答

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

+0

哇!這完全違背了直覺,沒有多大意義。 – user1738358

+0

更糟的是,當緩存啓用vs禁用時,我的應用程序的行爲會有所不同? – user1738358

+0

也許吧。但是,從ORM來看,跟蹤更改非常昂貴。如果日期是不可變的,那麼它更有效,因爲很難說日期內部結構何時改變,否則當屬性發生變化時,屬性更改跟蹤不能用於內部。比較可以使用'==',並且如果緩存對象是不可變的,則可以將緩存對象中的值設置爲'='。如果沒有共享緩存,多次讀取對象意味着每次都有一個新的實例 - 帶有自己的日期實例。共享緩存重用相同的實例及其日期對象。 – Chris