2013-03-10 75 views
0

我有下一个问题: 我有一个“用户”实体与“角色”有多对多的关系。事情是,“角色”被列举(总是有5个),所以每当我获取用户时抓取它们似乎都没有必要(因为它们也很少改变)。我想以某种方式将角色保存在记忆中,并在我带她时将其附加到用户身上。值得注意的是,hibernate已经启用了二级缓存,所以如果需要的话,我将能够使用它。 有没有人有这个解决方案?枚举值与休眠和缓存

在此先感谢

+0

答案在问题中,不是吗?使用二级缓存。 (但我不确定这会有什么重大区别,因为通过ID在5行表中获得角色已经非常快) – 2013-03-10 10:59:26

+0

此外,您仍然可以缓存角色和用户之间的关联。 – benzonico 2013-03-10 15:58:22

回答

0

如果你可以改变你的数据模型,删除表的角色和您的许多一对多表转换成一个简单多到一个表的外键的用户,以及列保存角色(作为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 enum的开头添加一个虚拟角色。

+0

但是,这将有效地创建OneToMany关系。所以这些条目看起来像(“用户1”,“角色1”)(“用户1”,“角色2”)(“用户2”,“角色1”),我希望避免这种情况 – ShinySpiderdude 2013-03-10 15:53:07

+0

当然,因为你有这样的要求将多个角色分配给单个用户,您无法避免一对多关系。你只需要配置一些缓存,以避免每次都抓取它们,但使用这个解决方案,你根本不需要获取角色,这似乎是你问的。 – 2013-03-10 21:30:47