Аннотации JDO: переименование столбцов в иерархии на несколько уровней - PullRequest
0 голосов
/ 11 декабря 2011

Я пытаюсь определить три класса, используя аннотации JDO. Level3 имеет два встроенных члена типа Level2, а Level2 имеет один встроенный член типа Level1. Как это:

@PersistenceCapable
@EmbeddedOnly
public class Level1 {
  @Persistent
  private Long lvl1_;
}

@PersistenceCapable
@EmbeddedOnly
public class Level2 {
  @Persistent
  @Embedded(members = {
    @Persistent(name="lvl1_", columns=@Column(name="lvl1inlvl2_")),
  })
  private Level1 lvl1embedded_;
}

@PersistenceCapable
public class Level3 {
  @Persistent
  @Embedded(members = {
    @Persistent(name="lvl1embedded_",columns=@Column(name="lvl1inlvl3first_")),
  })
  private Level2 lvl2embeddedfirst_;

  @Persistent
  @Embedded(members = {
    @Persistent(name="lvl1embedded_",columns=@Column(name="lvl1inlvl3second_")),
  })
  private Level2 lvl2embeddedsecond_;
}

Я переименовываю члена уровня 1 в уровень 2 и члена уровня 2 в уровень 3. Это работает в Google App Engine, но при попытке запустить Tomcat выдает следующее исключение:

Duplicate column name "`LVL1_`" defined for table "`LEVEL3`". You cannot map multiple fields to the same column. The duplicated columns are specified by Level1.lvl1_ and Level1.lvl1_

Можно было бы удалить класс Level1 и скопировать код в Level2, но у меня есть несколько других классов, встраивающих Level1, поэтому я не хочу повторять один и тот же код везде.

Я пытался использовать точечную нотацию для ссылки на членов уровня 1 с уровня 3, но это не работает:

@Embedded(members = {
  @Persistent(name="Level1.lvl1_",columns=@Column(name="lvl1inlvl3second_")),
})

Энхансер выдает такие ошибки:

Class Level3 has field Level1.lvl1_ declared in MetaData, but this field doesnt exist in the class!

Есть идеи? Спасибо!

PS: кстати, это мой первый вопрос, будьте добры :)


Для полноты потрясения, следуя ответу ниже, метаданные XML для уровня 3 должны выглядеть примерно так:

<class name="Level3"
       persistence-modifier="persistence-capable"
       table="LEVEL3">

  <field name="lvl2embeddedfirst_"
         persistence-modifier="persistent">
    <embedded>
      <field name="lvl1embedded" column="level3lvl1embedded">
        <embedded>
          <field name="lvl1_" column="level3lvl1_"/>
        </embedded>
      </field>
    </embedded>
  </field>
</class>

1 Ответ

0 голосов
/ 12 декабря 2011

Хранилище данных GAE (и плагин) не проверяет наличие дублирующегося имени столбца (свойства) (которое у вас есть с полем Level1 из 2 Level2s) - что является ошибкой в ​​GAE. Плагин RDBMS DataNucleus (и хранилище данных RDBMS) проверяет наличие дублирующих столбцов (и выдает исключение).

Использование аннотаций (в настоящее время) не позволяет указать переопределение столбца для вложенных встроенных объектов. Однако вы можете указать переопределение столбцов с помощью XML (файл package.jdo). Но тогда указание конкретной информации ORM ВСЕГДА рекомендуется выполнять в XML-файле

...