Hibernate - 不止一次映射一个类

时间:2013-01-17 17:16:23

标签: java hibernate

我正在尝试添加一个新添加的类。当我开始时,有一个名为Tournament的类,其成员类型为Schedule,它只包含Session个对象的列表。这是该类的hibernate映射。这是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映射上面的那个:

<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.

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

1 个答案:

答案 0 :(得分:1)

您无法两次映射课程。 Hibernate无法处理这个问题。正如你所见,你会得到奇怪的错误。 (当一个类被映射两次时,第一级缓存也无法正常工作,因为Hibernate使用该类来决定缓存实例属于哪个表。我有效在uniqueResult上获取两个实例(以及异常)( )在表中只有一个想法。)

你能做什么:

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

public class TournamentSession extends Session {}

public class OtherSession extends Session {}

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