1

我正在尝试添加一个持久化新添加的类。当我开始时,有一个以Tournamenttype 成员命名的类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")

似乎hibernate不喜欢我反复使用这个类,所以我尝试将属性添加entity-name="OtherThingSession"到一对多元素。现在我遇到了这个错误:

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

这让我愣了一分钟,所以我回去查看我原来的错误。我决定只更改新映射中索引列的名称。这没有得到hibernate的抱怨,但是坚持没有用。当我试图tournament_sessions坚持一个OtherThing.

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

4

1 回答 1

1

你不能两次映射一个类。Hibernate 无法处理这个问题。如您所见,您会遇到奇怪的错误。(当一个类被映射两次时,一级缓存也不能正常工作,因为 Hibernate 使用该类来决定一个缓存实例属于哪个表。我的效果是在 uniqueResult( )认为表中只有一个。)

你可以做什么:

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

public class TournamentSession extends Session {}

public class OtherSession extends Session {}

然后在您使用的一个<one-to-many>属性TournamentSession中,在您使用的另一个属性中OtherSessionSession它本身永远不能被映射,也不能在 Hibernate 属性中使用。

于 2013-01-18T07:51:45.460 回答