繁体   English   中英

休眠-映射一个类不止一次

[英]Hibernate - mapping a class more than once

我正在尝试添加一个持久性新添加的类。 当我开始时,有一个名为Tournament的类,其成员的类型为Schedule ,该类仅包装Session对象的列表。 这是该类的休眠映射。 它的ID和其他字段已被省略。

<hibernate-mapping default-access="field">
  <class name="fully.qualified.class.Tournament" table="tournaments">
    <component name="schedule" class="fully.qualified.class.Schedule">
      <list name="sessions" cascade="all-delete-orphan" lazy="true" table="tournament_sessions" >
        <key column="tournament_id" not-null="true"/>
        <index column="session_index"/>
        <one-to-many class="fully.qualified.class.Session"/>
      </list>
    </component>
  </class>
</hibernate-mapping>

现在,我需要创建一个新的类OtherThing ,它也具有一个Schedule. 因此,我复制了会话表并将其命名为other_thing_sessions. 我还创建了一个类似于上面的休眠映射:

<hibernate-mapping default-access="field">
  <class name="fully.qualified.class.OtherThing" table="other_things">
    <component name="schedule" class="fully.qualified.class.Schedule">
      <list name="sessions" cascade="all-delete-orphan" lazy="true" table="other_thing_sessions" >
        <key column="other_thing_id" not-null="true"/>
        <index column="session_index"/>
        <one-to-many class="fully.qualified.class.Session"/>
      </list>
    </component>
  </class>
</hibernate-mapping>

令我惊讶的是,这导致了以下错误:

org.hibernate.MappingException: Repeated column in mapping for entity: fully.qualified.class.Session column: session_index (should be mapped with insert="false" update="false")

休眠似乎不喜欢我重复使用此类,因此我尝试将属性entity-name="OtherThingSession"到一对多元素。 现在我遇到了这个错误:

org.hibernate.MappingException: Association references unmapped class: OtherThingSession

这让我离开了一分钟,所以我回头看了看我原来的错误。 我决定只更改新映射中索引列的名称。 冬眠并没有引起抱怨,但是坚持不起作用。 好像它试图插入会话对象到tournament_sessions表时,我试图坚持一个OtherThing.

有人对如何解决此问题有任何想法吗?

您不能两次映射课程。 Hibernate无法处理此问题。 如您所见,您将得到比以前更奇怪的错误。 (同样,当一个类被映射两次时,一级缓存也无法正常工作,因为Hibernate使用该类来决定一个缓存实例属于哪个表。我的效果是在uniqueResult()上获得了两个实例(因此是一个异常)。 )以为表格中只有一个。)

你可以做什么:

创建两个“空”类,它们扩展了Session而不向其添加任何功能,例如

public class TournamentSession extends Session {}

public class OtherSession extends Session {}

然后在一个<one-to-many>属性中使用TournamentSession ,在另一个属性中使用OtherSession Session本身绝不能被映射,也不能在Hibernate属性中使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM