【问题标题】:JDO Annontations: renaming columns across a hierarchy several levels deepJDO Annontations:跨层次结构重命名列几个级别
【发布时间】: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


【解决方案1】:

GAE 数据存储(和插件)不检查重复的列(属性)名称(您在 2 个 Level2 的 Level1 的字段中拥有该名称) - 这是 GAE 中的一个错误。 RDBMS DataNucleus 插件(和 RDBMS 数据存储)确实检查重复的列(并引发异常)。

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

【讨论】:

  • 很好的答案,谢谢!您可以保留注释,只为 Level3 类编写 XML(XML 具有更高的优先级)。
猜你喜欢
  • 1970-01-01
  • 2013-07-04
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
相关资源
最近更新 更多