Xml 在hibernate映射中插入集合/列表的更新控件

Xml 在hibernate映射中插入集合/列表的更新控件,xml,hibernate,insert-update,Xml,Hibernate,Insert Update,我试图在hibernate 3映射中将两个集合映射到同一id列。 objectSet是“历史”的,我被要求将它保存在那里。idSet是一种新的解决方案,如果集合变大(一百万个实体),它将具有更好的性能 我希望idSet成为领先者。因此,插入和更新只能通过idSet完成。objectSet应该只是数据的第二个详细视图 为了实现这一点,我尝试在集合或多对一上设置insert=“true”和update=“true”。但是,两者都不支持这种上下文中的这些属性 如何告知集合或列表不进行任何更新或插入

我试图在hibernate 3映射中将两个集合映射到同一id列。 objectSet是“历史”的,我被要求将它保存在那里。idSet是一种新的解决方案,如果集合变大(一百万个实体),它将具有更好的性能


我希望idSet成为领先者。因此,插入和更新只能通过idSet完成。objectSet应该只是数据的第二个详细视图

为了实现这一点,我尝试在集合或多对一上设置
insert=“true”
update=“true”
。但是,两者都不支持这种上下文中的这些属性


如何告知集合或列表不进行任何更新或插入?

我希望您可以通过更改级联选项来控制行为。将一个设置为“无”,另一个设置为“保存更新”或任何合适的设置。我还没试过,但听起来不错。请注意脏检查机制-请参阅以了解更多详细信息。

我找到了一种可能比我最初寻找的解决方案更有意义的解决方案

我在映射中添加了
mutable=“false”
,因此不再允许对objectSet进行更改。(查看此处了解更多详细信息。)我仍然可以更改idSet,但这将导致两个列表不同步

<set cascade="none" name="objectSet" table="TBL_A_HAS_B"
  lazy="true" mutable="false" >
  <key column="A_ID" />
  <many-to-many class="test.B" column="B_ID" unique="true" />
</set>
  • getObjectSet()
    返回一个集合,该集合的元素可以更改,但不能添加或删除。尝试对该集合执行添加、删除或清除操作将引发JAVA异常。如果没有这个包装,只有在flush()发生或被强制时才会出现hibernate异常。我将其设置为不推荐(带有解释性注释),因此会收到一条警告,并且不鼓励使用它,因为当集合变大时,可能会出现性能问题,并且可能会失去同步

  • setObjectSet(..)
    受保护,因此它不可公开访问,同时仍然允许hibernate在收到请求时调用它来设置数据

  • replaceObjectSet()
    setObjectSet(…)
    的“新公共版本”,因此旧代码可以很容易地进行修改,但可以与新系统一起使用。它也不推荐使用指向idSet的链接

欢迎任何意见,如果这是一个好的解决方案或不是,如果你有一个更好的

编辑1:

这似乎不是全部答案
mutable=“false”
实际上并不等于只读。当对idSet进行更改并将其持久化时,Hibernate将首先基于idSet添加一个新id,然后再次删除它们,因为objectSet不包含这些id,并且“不可变”将永远不会更改

解决方案是添加
inverse=“true”

通过告诉Hibernate关联的另一方将处理更新,它将忽略此映射。由于关联的另一端不存在,其他任何东西都不会写入对象集的ID。所以现在的行为就像是只读的

<set cascade="none" name="objectSet" table="TBL_A_HAS_B"
  lazy="true" mutable="false" >
  <key column="A_ID" />
  <many-to-many class="test.B" column="B_ID" unique="true" />
</set>