私のエンティティ(myGroup : Group
)には、コレクションプロパティ(members : HashMap<Long, GroupMember>
)があり、ユーザーが複数の新しい(永続化されていない)GroupMember
をmyGroup.members
マップに追加できるようにしたいです。
コレクションプロパティにハッシュマップを使用している理由は、コレクションの使用が実行可能であることを確認するためです(つまり
GroupMember
、ビジネスロジックの実行中にIDをすばやく複数回取得できる必要があります)。それらをすぐに永続化したくない理由は、追加の復帰をサポートするためです。ユーザーは、マップを操作し、満足するまでメンバーを追加および削除してから、永続化できる必要があります
myGroup.members
(Hibernateセッションでエンティティを保存してフラッシュする)。
問題は、Hibernateが未保存であることを検出するために新しいGroupMember
sにゼロのIDを割り当てる必要があることです。(*)メンバーはマップ内にあり、IDでキー設定されているため、どちらの前にも1つの新しいメンバーしか追加できません。保存または元に戻します。IDがゼロの2番目の新しいメンバーを追加すると、最初のメンバー(への参照)が単純にオーバーライドされます。
私の質問myGroup.members
は、ハッシュマップまたは他のマップ/辞書を使用することのパフォーマンス上の利点を維持しながら、コレクション()への複数の未保存エンティティの追加をサポートするためにコードソリューションをどのように最適に適応させることができるかです。
注:IDがインスタンス内のデータの一意の組み合わせから派生しGroupMember
、保存の直前に、Hibernateが永続化する必要があることを検出するために、IDがゼロに設定されるハックをすでに試しましたが、エレガントではなく、私はそれが確実に機能する方法を見つけていません。
*この点に関する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...
}