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
注释吗?因为它应该@Cacheable
是关于二级缓存的。如果从缓存中提取一个实体,它将从缓存中存储的信息中实例化,而不是从同一个实例中实例化。后者不起作用。实体始终只能附加到单个会话,但二级缓存跨会话存在
如果一个实体的两个表示形式属于同一会话,则它们应该是完全相同的实例
为了决定是否使用缓存,您有两个很好的选择:
[Table `role_assign`]
int user_id
int role_id