Google app engine JDO注释:跨多个层次重命名列

Google app engine JDO注释:跨多个层次重命名列,google-app-engine,tomcat,annotations,jdo,datanucleus,Google App Engine,Tomcat,Annotations,Jdo,Datanucleus,我试图使用JDO注释定义三个类。Level3有两个Level2类型的嵌入构件,Level2有一个Level1类型的嵌入构件。像这样: @PersistenceCapable @EmbeddedOnly public class Level1 { @Persistent private Long lvl1_; } @PersistenceCapable @EmbeddedOnly public class Level2 { @Persistent @Embedded(member

我试图使用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应用程序引擎中起作用,但尝试运行它时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!
<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>
有什么想法吗?谢谢

顺便说一句,这是我的第一个问题,善良点:

为了完整性起见,根据下面的答案,Level3的XML元数据应该是这样的:

Class Level3 has field Level1.lvl1_ declared in MetaData, but this field doesnt exist in the class!
<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个Level2s中的Level1字段中是否有重复的列属性名,这是GAE中的一个错误。RDBMS DataNucleus插件和RDBMS数据存储会检查重复列并引发异常


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

在Tomcat中运行它是什么意思?您可能有一些未定义类型的数据存储,我认为在Tomcat中运行意味着Tomcat+Mysql+datanucleus rdbms?这就是你要问的吗?我在Tomcat日志中看到了重复的列名错误。谢谢你的帮助!!好的,那么使用RDBMS。因为可以将Tomcat与许多其他类型的数据存储一起使用,所以答案非常好,谢谢!您可以保留注释,只需为具有更高优先级的类Level3编写XML。