gpt4 book ai didi

java - 使用 spring data jpa 缓存实体

转载 作者:搜寻专家 更新时间:2023-10-30 20:50:24 24 4
gpt4 key购买 nike

我在我的数据库 role_template 中定义了角色。

@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;
}

角色通过我的关联表加入到用户

[Table `role_assign`]
int user_id
int role_id

我的问题是可以预见的,@Cacheable 不起作用。我试过 2 个用户,他们有相同的 Role 模板,但不是相同的 instance。 transient 变量 identity 不等于两个用户的角色。我的应用程序配置很好,我想我忘记了一些让它为 @JoinTable 工作的东西/p>

最佳答案

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

  2. 我认为您对缓存如何与 JPA 一起工作的理解是错误的,您的观察不足以决定是否进行缓存。

@Cacheable 是关于二级缓存的。如果一个实体是从缓存中提取的,它是根据存储在缓存中的信息实例化的,而不是实际上是同一个实例。后者行不通。实体始终只能附加到单个 session ,但二级缓存跨 session 存在。

如果一个实体的两个表示属于同一个 session ,则它们应该是同一个实例。

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

  1. 记录针对数据库发出的 SQL 语句,并查看实体的数据是否被一遍又一遍地选择,或者只选择一次。

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

如何做到这一点取决于您使用的 JPA 提供程序。 Here are instructions for Hibernate .

关于java - 使用 spring data jpa 缓存实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45457059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com