Я пытаюсь определить три класса, используя аннотации 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>