In the following test code, we expect the values of the entity values to be restored from the query cache, but it seems that they are not being restored correctly.
test code
package test.querycache;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class QueryCacheTest {
private SessionFactory sf;
@Before
public void setup() {
StandardServiceRegistryBuilder srb = new StandardServiceRegistryBuilder()
.applySetting("hibernate.show_sql", "true")
.applySetting("hibernate.format_sql", "true")
.applySetting("hibernate.hbm2ddl.auto", "update")
.applySetting("hibernate.cache.use_second_level_cache", true)
.applySetting("hibernate.cache.use_query_cache", true)
.applySetting("hibernate.cache.region.factory_class", "jcache");
Metadata metadata = new MetadataSources(srb.build())
.addAnnotatedClass(TestEntity.class)
.buildMetadata();
sf = metadata.buildSessionFactory();
}
private static final String TEXT = "text";
private static final String QUERY = "select E from TestEntity E where text=:text";
@Test
public void ngTest() throws Exception {
// create entity
final var s1 = sf.openSession();
final var tx1 = s1.beginTransaction();
final var entity1 = new TestEntity();
entity1.setId(1L);
entity1.setText(TEXT);
s1.persist(entity1);
tx1.commit();
s1.close();
// save query cache from managed entity
final var s2 = sf.openSession();
s2.get(TestEntity.class, 1L);
final var entity2 = s2.createQuery(QUERY, TestEntity.class)
.setParameter("text", TEXT)
.setCacheable(true)
.getSingleResult();
Assert.assertEquals(TEXT, entity2.getText());
s2.close();
// use query cache
final var s3 = sf.openSession();
final var entity3 = s3.createQuery(QUERY, TestEntity.class)
.setParameter("text", TEXT)
.setCacheable(true)
.getSingleResult();
Assert.assertEquals(TEXT, entity3.getText()); // entity3.getText() is null !
s3.close();
}
}
test entity
package test.querycache;
import jakarta.persistence.Cacheable;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
@Cacheable
public class TestEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}