【发布时间】:2011-12-11 12:25:44
【问题描述】:
我正在尝试使用 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_;
}
我在 Level2 中重命名 Level1 的成员,在 Level3 中重命名 Level2 的成员。 这在 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 的类,所以我不希望到处都重复相同的代码。
我尝试使用点符号从 Level3 中引用 Level1 的成员,但它不起作用:
@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:顺便说一句,这是我的第一个问题,请善待:)
为了完整性,按照下面的答案,Level3 的 XML 元数据应该是这样的:
<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>
【问题讨论】:
-
“在 Tomcat 中运行”是什么意思?你可能有一些未定义类型的数据存储
-
我认为“在Tomcat中运行”是指Tomcat + Mysql + datanucleus rdbms?这就是你要问的吗?我在 Tomcat 日志中看到“列名重复”错误。谢谢你的帮助!!
-
好的,然后使用 RDBMS。因为也可以将 Tomcat 与许多其他类型的数据存储一起使用
标签: google-app-engine tomcat annotations jdo datanucleus