This commit is contained in:
Guenther Demetz 2012-04-26 16:00:30 +02:00 committed by Steve Ebersole
parent 94341fdc44
commit f5e6a44f7e
3 changed files with 49 additions and 0 deletions

View File

@ -1801,6 +1801,9 @@ public class StatefulPersistenceContext implements PersistenceContext {
CachedNaturalIdValueSource source) { CachedNaturalIdValueSource source) {
final NaturalIdRegionAccessStrategy naturalIdCacheAccessStrategy = persister.getNaturalIdCacheAccessStrategy(); final NaturalIdRegionAccessStrategy naturalIdCacheAccessStrategy = persister.getNaturalIdCacheAccessStrategy();
final NaturalIdCacheKey naturalIdCacheKey = new NaturalIdCacheKey( naturalIdValues, persister, session ); final NaturalIdCacheKey naturalIdCacheKey = new NaturalIdCacheKey( naturalIdValues, persister, session );
if (naturalIdCacheAccessStrategy.get(naturalIdCacheKey, session.getTimestamp()) != null) {
return; // prevent identical re-cachings
}
final SessionFactoryImplementor factory = session.getFactory(); final SessionFactoryImplementor factory = session.getFactory();

View File

@ -39,6 +39,7 @@ import org.hibernate.annotations.NaturalIdCache;
public class Another { public class Another {
private Integer id; private Integer id;
private String name; private String name;
private String surname;
public Another() { public Another() {
} }
@ -66,4 +67,12 @@ public class Another {
public void setName(String name) { public void setName(String name) {
this.name = name; this.name = name;
} }
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
} }

View File

@ -23,6 +23,8 @@
*/ */
package org.hibernate.test.naturalid.mutable.cached; package org.hibernate.test.naturalid.mutable.cached;
import java.io.Serializable;
import org.junit.Test; import org.junit.Test;
import org.hibernate.Session; import org.hibernate.Session;
@ -225,5 +227,40 @@ public class CachedMutableNaturalIdTest extends BaseCoreFunctionalTestCase {
assertEquals(0, session.getSessionFactory().getStatistics().getNaturalIdCacheHitCount()); assertEquals(0, session.getSessionFactory().getStatistics().getNaturalIdCacheHitCount());
} }
@Test
public void testNaturalIdRecachingWhenNeeded() {
Session session = openSession();
session.getSessionFactory().getStatistics().clear();
session.beginTransaction();
Another it = new Another( "it");
session.save( it );
Serializable id = it.getId();
session.getTransaction().commit();
session.close();
session = openSession();
for (int i=0; i < 10; i++) {
session.beginTransaction();
it = (Another) session.byId(Another.class).load(id);
if (i == 9) {
it.setName("name" + i);
}
it.setSurname("surname" + i); // changing something but not the natural-id's
session.getTransaction().commit();
}
session = openSession();
session.beginTransaction();
it = (Another) session.bySimpleNaturalId(Another.class).load("it");
assertNull(it);
assertEquals(0, session.getSessionFactory().getStatistics().getNaturalIdCacheHitCount());
it = (Another) session.byId(Another.class).load(id);
session.delete(it);
session.getTransaction().commit();
// finally there should be only 2 NaturalIdCache puts : 1. insertion, 2. when updating natural-id from 'it' to 'name9'
assertEquals(2, session.getSessionFactory().getStatistics().getNaturalIdCachePutCount());
}
} }