Harold - Are you using a DetachedStateManager? If so, this sounds like it might be a bug?
Can you post the contents of your persistence.xml file? Thanks, Rick On Fri, Aug 20, 2010 at 11:11 AM, Harald Wellmann < [email protected]> wrote: > > I have an entity with a map element collection where the map value is an > Embeddable. > > @Embeddable > public class LocalizedString { > > private String language; > private String text; > > // getters and setters omitted > } > > > > @Entity > public class MultilingualString { > > @Id > private long id; > > @ElementCollection(fetch=FetchType.EAGER) > private Map<String, LocalizedString> map = new HashMap<String, > LocalizedString>(); > } > > > Given a persistent instance m of my entity, I update a member of a given > map > value and then merge the modified entity: > > EntityManager em = ...; > em.getTransaction().begin(); > m.getMap().get("en").setText("foo"); > em.merge(m) > em.getTransaction().commit(); > > The problem is, the state change of the map does not get saved to the > database. With DEBUG logging on, I can see that the flush on commit does > not > trigger any SQL UPDATE. > > To force the update, I have to put a new value into the map instead of just > changing the existing one. > > EntityManager em = ...; > em.getTransaction().begin(); > m.getMap().put("en"), new LocalizedString("en", "foo")); > em.merge(m) > em.getTransaction().commit(); > > After this change, I do see the expected UPDATE. > > My Embeddable does have hashCode() and equals() implemented such that the > changed map is not equal() to the former version in either case. > > Is this the expected behaviour, or is there a bug in the dirty-checking > logic in OpenJPA? > > Best regards, > > Harald > >
