在我的实体 ( myGroup : Group
) 上,我有一个集合属性 ( members : HashMap<Long, GroupMember>
),我希望允许用户向地图添加多个新的(未持久化GroupMember
的) myGroup.members
。
我为集合属性使用哈希图的原因是为了确保集合的使用是高性能的(即
GroupMember
在业务逻辑执行期间必须能够通过其 ID 快速多次获取 a)。我不想立即保留它们的原因是支持添加的还原。用户必须能够操作
myGroup.members
映射,添加和删除成员直到满意,然后再持久化(在 Hibernate 会话中保存实体并刷新)。
问题是GroupMember
必须为 new 分配一个 ID 为零,以便 Hibernate 检测到它们未保存。(*) 因为成员位于映射中,由 ID 键入,这意味着只能添加一个新成员保存或还原。添加第二个 ID 为 0 的新成员会简单地覆盖(引用)第一个成员。
我的问题是如何最好地调整我的代码解决方案以支持将多个未保存的实体添加到集合(myGroup.members
)中,同时保持使用哈希映射或其他映射/字典的性能优势?
注意:我已经尝试过一种 hack,其中 ID 来自GroupMember
实例中数据的唯一组合,然后,在保存之前,ID 设置为零,以便 Hibernate 检测到它需要被持久化,但它是不优雅,我还没有找到让它可靠工作的方法。
* 我不完全理解 Hibernate 在这方面的行为。
Group
以下实体的缩写代码:
@Entity
@Table (name="GROUP")
public class Group
{
private Map<Long,GroupMember> members = new HashMap<Long,GroupMember>();
@OneToMany(fetch = FetchType.LAZY, mappedBy = "ownerGroup", cascade = { CascadeType.ALL })
@MapKey(name="id")
public Map<Long,GroupMember> getMembers() { return this.members; }
public void setMembers(Map<Long,GroupMember> members) { this.members = members; }
// ...other properties and methods...
}