我有一个完全不可变且很小的国家的经典实体,所以我决定用hibernate缓存实体,但如果我在查询所有实体时启用实体缓存,那么除了id重复之外我得到了其他属性(即具有不同ID但名称相同且所有其他字段的值相同的列表)。
@Immutable
@Entity @Table(name="countries")
@Cacheable @Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class Country {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
protected Short id;
@Column(nullable = false)
protected String name;
....
}
hibernate配置如下:
hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQLSpatialDialect
hibernate.format_sql=true
hibernate.hbm2ddl.auto=update
hibernate.hbm2ddl.import_files=data-catalogs-create.sql,data-mysql-sample.sql
hibernate.hbm2ddl.import_files_sql_extractor=org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
hibernate.implicit_naming_strategy=com.example.util.ImplicitNamingStrategy
hibernate.physical_naming_strategy=com.example.util.PhysicalNamingStrategyImpl
hibernate.show_sql=false
hibernate.cache.region.factory_class=org.hibernate.cache.redis.hibernate5.SingletonRedisRegionFactory
hibernate.cache.region_prefix=hibernate
hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=true
hibernate.cache.use_structured_entries=true
hibernate.cache.provider_configuration_file_resource_path=hibernate-redis.properties
hibernate.generate_statistics=false
hibernate.search.default.directory_provider=filesystem
hibernate.search.default.indexBase=/var/lucene/indexes
equals / hashCode基于实体id,我对它进行了测试(番石榴测试),所以我放弃了与此相关的一些错误。
在我删除/评论@ Cacheable / @ Cache注释的那一刻,问题就消失了。