【问题标题】:enumerated values with hibernate and cache具有休眠和缓存的枚举值
【发布时间】:2013-03-10 10:47:18
【问题描述】:

我有下一个问题: 我有一个与“角色”有多对多关系的“用户”实体。问题是,“角色”是枚举的(总是有 5 个),所以每当我获取用户时获取它们似乎是不必要的(因为它们也很少改变)。我想以某种方式将角色保存在内存中,并在我带她时将它们附加给用户。值得注意的是,休眠启用了二级缓存,因此我可以在必要时使用它。 有人对此有解决方案吗?

提前致谢

【问题讨论】:

  • 答案就在问题中,不是吗?使用二级缓存。 (我不确定这是否会产生任何显着差异,因为在 5 行的表中通过 ID 获取角色已经非常快了)
  • 此外,您仍然可以缓存您的角色和您的用户之间的关联。

标签: java hibernate caching second-level-cache


【解决方案1】:

如果您可以更改数据模型,请删除表角色并将多对多表转换为简单的多对一表,其中包含用户的外键和保存角色的列(作为 varchar或作为数字,但我建议使用 varchar,因为它更易于维护)。然后您可以将此表映射为:

@Entity
public class UserRole {
    @ManyToOne
    private User user;
    @Column
    @Enumerated(EnumType.STRING) // depends if column is varchar or number
    private Role role;
}

public enum Role { ROLE1, ROLE2, ROLE3, ROLE4, ROLE5 }

请注意,如果您不删除角色表,只要您的角色 ID 为 0 到 4,也可以使用 EnumType.ORDINAL 映射(这是默认值)执行此操作。如果它们是 1 到 5,请在 Role 枚举的开头添加一个虚拟角色。

【讨论】:

  • 但这会有效地创建 OneToMany 关系。所以条目看起来像 ("User1", "Role1") ("User1", "Role2") ("User2", "Role1") 我希望避免这种情况
  • 当然可以,因为您需要为单个用户分配多个角色,因此您无法避免一对多的关系。您只需要配置一些缓存以避免每次都获取它们,但是使用此解决方案您根本不需要获取角色,这似乎是您所要求的。
猜你喜欢
  • 2012-08-21
  • 2012-01-17
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多