Java 使用spring数据jpa缓存实体

Java 使用spring数据jpa缓存实体,java,database,caching,spring-data,Java,Database,Caching,Spring Data,我已在数据库中定义了角色role\u模板 @Entity @Table(name = "role_template") @Cacheable public class Role { @Id private int id; private String name; @Transient private final int identity = new Random().nextInt(1000000) + 1; } 我现在有一个角色,id=1,name=

我已在数据库中定义了角色
role\u模板

@Entity
@Table(name = "role_template")
@Cacheable
public class Role {
    @Id
    private int id;
    private String name;

    @Transient
    private final int identity = new Random().nextInt(1000000) + 1;
}
我现在有一个角色,id=1,name=“admin”
我的实体
User
有一个角色列表,定义如下

@Entity
@Table(name = "app_user")
public class User {
    [...]

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "role_assign",
        joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
    private Set<Role> roles;
}
我的问题是可以预见的,
@Cacheable
不起作用。 我尝试了两个用户,他们有相同的
角色
模板,但不相同的
实例
。瞬态变量
identity
对于两个用户的角色不相等。。我的应用程序配置很好,我想我忘了让它在
@JoinTable

  • 这是
    javax.persistence.Cacheable
    注释吗?因为它应该

  • 我认为您对缓存如何与JPA一起工作的理解是错误的,您的观察不足以决定缓存是否发生

  • @Cacheable
    是关于二级缓存的。如果从缓存中提取一个实体,它将从缓存中存储的信息中实例化,而不是从同一个实例中实例化。后者不起作用。实体始终只能附加到单个会话,但二级缓存跨会话存在

    如果一个实体的两个表示形式属于同一会话,则它们应该是完全相同的实例

    为了决定是否使用缓存,您有两个很好的选择:

  • 记录针对数据库发出的SQL语句,并查看是否反复选择实体的数据,或者仅选择一次

  • 记录缓存交互并直接查看发生了什么

  • 如何做到这一点取决于您使用的JPA提供商

    [Table `role_assign`]
       int user_id
       int role_id