Michael, Thanks for your quick answer. This leads me to two new points:
- You said that an entity is attached when freshly loaded, but I found no way to explicitly detach entities. Am I right? If so, I think you should update the documentation which is quite confusing on this point, and explain clearly that detach entities should be used in a "write-only" mode. - Moreover, I think there could be some confusing side effects if entities always use read-through : Does this work with a cache or do the entities always read through the database? How would this example behave with two different clients : A client X does the following (let's say title property is indexed): 1. Movie retrievedMovie = movieRepository.findByPropertyValue("Babel"); 2. output(retrievedMovie.getTitle()) // prepare some output like Web page 3. ... do some other operations 4. output(retrievedMovie.getTitle()) // for some reason, a second output is needed In the same time, a client Y executes the following code: 1. Movie retrievedMovie = movieRepository.findByPropertyValue("Babel"); 2.retrievedMovie.setTitle("New title")); 3. retrievedMovie.persist(); 4. Some other stuff we don't care Which should be the value of the movie title for client X on step 4? Thanks by advance for your answer. Michel > Date: Tue, 23 Aug 2011 11:42:13 +0200 > From: Michael Hunger <michael.hun...@neotechnology.com> > Subject: Re: [Neo4j] [Spring Data Graph] Precisions about Detached > Entities and SDG under the hood > To: Neo4j user discussions <user@lists.neo4j.org> > Message-ID: <3a2f0a73-6183-4b32-a02a-7219f0a7f...@neotechnology.com > > > Content-Type: text/plain; charset=us-ascii > > there are two states attached and detached: > > an entity is detached when it is created or when it is changed outside of a > transaction. > > Otherwise (when it is freshly loaded, or after persist it is attached). > > For detached entities: persist() writes the changed properties and > relationships to the graph. if attached (and inside of a tx) all changes are > written directly. > > In your example you just overwrote the title with Babel and persisted that > information to the graph, so the assert should say: > The retrieved movie is attached, it is never detached, so it always refers > to the node in the graph (read-through) (the data is _not_ copied). > > > assertEquals("Babel", retrievedMovie.getTitle()); > > > Attached entities read their data directly from the underlying node. > > HTH > > Michael > > The model is different to hibernate, as hibernate has no read-through. We > would have loved not to support detached entities but as they are so common > in web-frameworks we had to. > > The best way of working with SDG is to use domain level service methods > which are transactional and do the interaction with the graph. Detached > entities should just be used to (if at all) to persist > user input (form data) from the UI. > > > > Am 23.08.2011 um 10:56 schrieb Michel Domenjoud: > > > Hello, > > I'm currently testing some of Spring Data Graph features, and I have a > few > > questions about some usages. > > > > Could someone explain to me how the following example works? > > I run the following unit test: > > > > @Test > > public void testUpdatingEntitiesNotInTransaction(){ > > Movie m = new Movie(); > > m.setTitle("Leon"); > > m.persist(); > > Long id = m.getNodeId(); > > Movie retrievedMovie = movieRepository.findOne(id); > > m.setTitle("Babel"); > > m.persist(); > > assertEquals("Leon", retrievedMovie.getTitle()); > > > > } > > > > And the assertion at the end fails, as retrievedMovie.getTitle() equals > > "Babel" and not "Leon". > > This point is not really clear in the documentation : > > Does this occurs because of some cache? If so, is it the Neo4j cache? And > > what is exactly its scope : thread, session, ...? > > Or is any call to getters triggering an access to the database because of > > AspectJ? > > > > Anyway, unless I misundestood something, it's a bit confusing. Especially > > when used to APIs like Hibernate, which don't make any refresh of > retrieved > > entities once we are outside of a transaction. > > > > When I read this in documentation, I don't expect that any persist > operation > > affect other retrieved entities : > > Changing an attached entity inside a transaction will immediately write > > through the changes to the datastore. Whenever an entity is changed > outside > > of a transaction it becomes detached. The changes are stored in the > entity > > itself until the next call to persist(). > > > > All entities returned by library functions are initially in an attached > > state. Just as with any other entity, changing them outside of a > transaction > > detaches them, and they must be reattached with persist() for the data to > be > > saved. > > Maybe I have to precise some points : > > > > - I'm using Embedded database, with beforeTest cleaning > > - I don't use any transaction in this test. > > > > > > Thanks by advance for your help! > > Michel > > _______________________________________________ > > Neo4j mailing list > > User@lists.neo4j.org > > https://lists.neo4j.org/mailman/listinfo/user > _______________________________________________ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user