@Entity
@Table(name = "abc")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Abc{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;
@OneToMany(mappedBy = "Abc")
@Column(name = "name", nullable = false)
private String name;
@Cache
private List<AbcAccess> accesses = new ArrayList<>();
}
@Entity
@Table(name = "abc_access")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AbcAccess {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;
@Column(name = "name", nullable = false)
private String name;
@ManyToOne(optional = false)
private Abc abc;
}
Backgroud: Spring Boot + Spring JPA (hibernate) + Ehcache, 2nd level cache enable.
Cache
is org.hibernate.annotations.Cache
configuration (written in kotlin):
@Configuration
@EnableCaching
class AbcConifg{
private val jcacheConfiguration: javax.cache.configuration.Configuration<Any, Any>
init {
val ehcache = jHipsterProperties.cache.ehcache
jcacheConfiguration = Eh107Configuration.fromEhcacheCacheConfiguration(
CacheConfigurationBuilder.newCacheConfigurationBuilder(
Any::class.java, Any::class.java,
ResourcePoolsBuilder.heap(ehcache.maxEntries)
)
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(ehcache.timeToLiveSeconds.toLong())))
.build()
)
}
@Bean
fun hibernatePropertiesCustomizer(cacheManager: javax.cache.CacheManager) = HibernatePropertiesCustomizer {
hibernateProperties -> hibernateProperties[ConfigSettings.CACHE_MANAGER] = cacheManager
}
}
When I query Abc
from the database, it will cache the result into 2nd level cache.
Now I insert one more AbcAccess
into the database, then I query Abc
from the database again, it will just get the result from the cache. And the access
in Abc
is not the real-time one, it misses one access
.
question from:
https://stackoverflow.com/questions/65914555/how-to-synchronise-the-hibernate-cache-with-external-changes 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…