我有引用类型枚举列表的实体。该列表存储在数据库如下:
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
,因为我现在只能查询一次数据库,并需要得到角色,以及为以后使用。当然,我也可以改变我的方式应用程序处理这和查询的角色,当我再次需要他们明确,寿,我不知道这样会更好。
好吧,我发现了一个不太好的解决方法。首先,我的注解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] 删除。
我来说两句