【发布时间】:2014-08-31 02:39:47
【问题描述】:
自学Hibernate,我有如下表结构/关系
由以下类表示...
用户
@Entity
@Table(name = "users")
public class User implements IUser<Role>, Serializable {
@Id
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
@SequenceGenerator(name = "user_key_seq")
@Column(name = "key", insertable = false, updatable = false)
private Long key;
@Column(name = "name")
private String name;
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name = "userroles",
joinColumns = {
@JoinColumn(name = "userkey")},
inverseJoinColumns = {
@JoinColumn(name = "rolekey")})
private Set<Role> roles = new HashSet<>(5);
@Override
public Set<Role> getRoles() {
return roles;
}
// Other setters and getters
}
角色
@Entity
@Table(name = "roles")
public class Role implements IRole, Serializable {
@Id
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
@SequenceGenerator(name = "roles_key_seq")
@Column(name = "key", insertable = false, updatable = false)
private Long key;
@Column(name="name")
private String name;
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="parentroles",
joinColumns = {@JoinColumn(name="childkey")},
inverseJoinColumns = {@JoinColumn(name="parentkey")})
private Set<Role> roles = new HashSet<>(5);
// Other setters and getters
}
我遇到的问题是……
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.kaizen.chishiki.core.data.User.roles, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:575)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:214)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:554)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:142)
at org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:180)
at og.kaizen.chishiki.core.testdatacore.Main.<init>(Main.java:37)
at og.kaizen.chishiki.core.testdatacore.Main.main(Main.java:25)
现在,我知道我可以将 fetch 类型设置为 FetchType.EAGER,但我不想这样做,除了性能问题,我正在努力学习解决这些问题的方法;)
我想知道是否有办法编写 Hibernate 查询来满足这种关系并手动加载行(它还允许我返回 Role 的接口而不是我必须做的实现现在(允许我维持该合同)。
根据我的阅读,我似乎需要为UserRoles 构造一个Entity。并不是说我反对这个解决方案,但我很好奇是否有办法绕过它。
roles出现在其他一些关系中,所以没办法和父表形成直接关系(就是我不能把父表的key放到@987654333直接@table,另外users可以有多个roles)
我想到的另一个解决方案是编写一个存储过程来为我做这件事。虽然这是一个可行的解决方案,但我并不在意,但它确实使将应用程序迁移到另一个数据库变得更加困难,而不是阻碍,但我试图牢记这些想法。
【问题讨论】:
-
我不确定您是否可以将其作为接口的实例而不是类来检索。
-
@LuiggiMendoza 我想要做的是返回接口的
Set,其中包含实现,我尝试这样做的原因是我的程序上面有一个接口层对话,以便加载数据的实际机制对程序层隐藏,所以如果我想更改“数据层”,我可以,就是这样;) -
@Zeus 是的,我已经读过,正如我所说,我知道我可以更改
fetch类型,但如果我能提供帮助,我宁愿不这样做,我会想知道这个特定问题的替代解决方案。这只是一个简单的例子,我有更复杂的关系,如果不是更多的子记录,最终可能会加载 100 个;)