如何正确映射枚举的集合休眠?

XtremeBaumer:

我有引用类型枚举列表的实体。该列表存储在数据库如下:

userName    role
-----------------------
user0001    role1
user0001    role2
user0001    role3
user0002    role1

相应的Java类大致是这样的:

@Entity
@Table(name = "UserTable")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "userId")
    private Integer id;
    @Column(name = "user_name")
    private String userName;

    @ElementCollection(targetClass = Role.class)
    @CollectionTable(name = "User_Roles")
    @Column(name = "role")
    @Enumerated(EnumType.STRING)
    private List<Role> roles;

}

我检查这个这个问题的映射。然而,我有两个问题。第一个问题是,userName是不是在我的PK UserTable而据我所知,Hibernate并加入PK上。

第二个问题是此错误与当前的设置:

org.hibernate.LazyInitializationException:无法初始化懒洋洋角色的集合:com.project.Common.User.roles,无法初始化代理 - 没有会话

这个错误应受固定EAGER载荷,但我想那一个,我在启动时得到了以下错误:

java.lang.IllegalStateException:试图注册多个SQL表别名[roles1_,roles2_等]针对查询空间的uid [<创:1>]

我需要做什么改变为了这个映射的工作?


请注意,我不希望执行任何数据库的更改,如果这是在任何可能的方式。

我还以为我真的得去FetchType.EAGER,因为我现在只能查询一次数据库,并需要得到角色,以及为以后使用。当然,我也可以改变我的方式应用程序处理这和查询的角色,当我再次需要他们明确,寿,我不知道这样会更好。

XtremeBaumer:

好吧,我发现了一个不太好的解决方法。首先,我的注解List<Role> roles;如下:

@ElementCollection(targetClass = Role.class)
@JoinTable(name = "User_Roles", joinColumns = @JoinColumn(name = "userName"))
@Enumerated(EnumType.STRING)
@Column(name = "role")
private List<Role> roles;

我的Role枚举没有任何注解。

该设置通常会导致LazyInitializationException,这是我工作围绕加入了System.out.println(user);,因为这确实访问roles列表(用替换它getRoles()导致了同样的异常)获取用户后直接。

正如您可以猜到,这个解决方案是不是真的没事/ acceptible可言。只要我没有找到一个更好的解决方案(最有可能急切加载),我将与此一个滚动。


UPDATE

其实,我知道了解决。它的工作原理现在eager-loading事实上,安装仍然是在回答上面张贴。IllegalStateException问题中提到我,实际上是由错误引起的HHH-12594我只是删除hibernate.default_batch_fetch_size从我的配置,并将其再担任意。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章