Неожиданное поведение общего кэша EclipseLink с полями java.util.Date
Я пинаю шины на EclipseLink(2.3.0) и обнаружил что-то, что кажется сильно неправильным. Суть моей проблемы в том, что когда сущность возвращается из общего кэша, java.util.Date
(и, возможно, другие) не копируются, как я ожидал. Это имеет некоторые довольно неприятные последствия, так как поля Date не являются неизменяемыми, и поэтому не могут быть разделены... но опять же, может быть, я что-то упустил? Я отмечу, что у меня не установлено никаких свойств, но я использую -javaagent
ткач в среде JSE.
Тестовый фрагмент:
// 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 ответ
Это описано в документации по EclipseLink здесь: http://wiki.eclipse.org/Introduction_to_EclipseLink_Application_Development_(ELUG)
Краткий ответ: большинство несериализованных основ обрабатываются как неизменяемые, но их можно настроить для обработки как изменяемые с помощью аннотации EclipseLink @Mutable: http://eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_mutable.htm