Jdo(datanucleus)integer_idx列和数据绑定

时间:2013-04-01 17:13:21

标签: java jdo datanucleus

我一直在尝试在DataNucleus JDO中进行简单的一对多对象绑定。它只是两个类(我剥离了一个简单的字段):

@PersistenceCapable(table="ORDER",schema="mgr")
public class Order {
    @PrimaryKey(column="id")
    @Persistent(valueStrategy=IdGeneratorStrategy.NATIVE,column="id")    
    private Long id;

    @Persistent(defaultFetchGroup="false",column="customer_id")
    @Element(column="customer_id")  
    private Customer customer;
}

具有订单列表的类Customer

@PersistenceCapable(table="customer",schema="mgr",identityType=IdentityType.DATASTORE)
@DatastoreIdentity(strategy=IdGeneratorStrategy.NATIVE)
public class Customer {
    @PrimaryKey
    @Persistent(valueStrategy=IdGeneratorStrategy.NATIVE,column="id")    
    private Long id;

    @Persistent(mappedBy="customer") 
    private List<Order> orders;
}

数据库表设置非常简单(一个用于客户的表和一个用于引用客户的外键(customer_id)的订单的表)。然而,当我尝试为客户插入一些订单时,我收到错误

  

javax.jdo.JDODataStoreException:插入对象   “test.Order@17dd585”使用声明“INSERT INTO   ORDER   (USER_COMMENTORDER_DATESTATUSCUSTOMER_IDORDERS_INTEGER_IDX)   VALUES(?,?,?,?,?)“失败:未知列'ORDERS_INTEGER_IDX'在   '字段列表'

不知何故DataNucleus假设,有一个列ORDERS_INTEGER_IDX(数据库中不存在这样的列)。我想到的唯一想法是http://www.datanucleus.org/products/datanucleus/jdo/metadata_xml.html

  

在某些情况下,DataNucleus会添加一个特殊的数据存储列   连接表,以便集合可以允许存储重复   元素。此扩展允许指定列名称   要使用的。这应该在该字段中指定   收集结束的关系。 JDO2不允许标准的地方   对于这样的规范,扩展标记也是如此。

太酷了! '在某些情况下'。我不知道如何让我的情况不是“某些情况”的一个子集,但我不知道如何让这个工作。也许某人已经遇到了“INTEGER_IDX”问题?或者(也很有可能) - 我没有正确地绑定数据:/

1 个答案:

答案 0 :(得分:3)

所以你自己创建架构。您的架构与元数据不一致。您可以在不根据模式验证元数据的情况下运行持久性,并且会产生异常。 DataNucleus为您提供SchemaTool,以根据您的元数据创建或验证架构,这意味着您可以检测到问题。

您正在使用索引列表,因此它需要每个元素的索引(或者如何知道元素所处的位置?)。怎么能假设有一个索引?好吧,这是一个叫做JDO规范(公开可用)的东西,它定义了索引列表。如果你不想存储元素的位置,那么不要使用List(用于保留元素位置的Java util类)...所以我建议使用Set,因为它不需要位置信息(因此没有索引)。

您还有一个标记为数据存储区标识的类,然后有一个主键。这是一个矛盾...你有一个或另一个。文档定义所有这些,以及如何具有1-N列表关系(“JDO API” - &gt;“映射” - &gt;“字段/属性” - &gt;“1-N关系” - &gt; “列表”或“集”)