gpt4 book ai didi

google-app-engine - JDO 注释 : renaming columns across a hierarchy several levels deep

转载 作者:行者123 更新时间:2023-11-28 23:51:11 24 4
gpt4 key购买 nike

我正在尝试使用 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>

最佳答案

GAE 数据存储(和插件)不检查重复的列(属性)名称(您在 2 个 Level2 的 Level1 的字段中有)——这是 GAE 中的一个错误。 RDBMS DataNucleus 插件(和 RDBMS 数据存储)会检查重复的列(并抛出异常)。

使用注解(目前)无法指定嵌套嵌入对象的列覆盖。但是,您可以使用 XML(package.jdo 文件)指定列覆盖。但是总是建议在 XML 文件中指定 ORM 特定信息

关于google-app-engine - JDO 注释 : renaming columns across a hierarchy several levels deep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8463924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com