2

我一直在尝试在 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)引用客户)。然而,当我尝试为客户插入一些订单时,我收到一个错误

ORDER javax.jdo.JDODataStoreException:使用语句“INSERT INTO ( USER_COMMENT, ORDER_DATE, STATUS, CUSTOMER_ID, ) VALUES (?,?,?,?,?)”插入对象“test.Order@17dd585” ORDERS_INTEGER_IDX失败:“字段”中的未知列“ORDERS_INTEGER_IDX”列表'

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

在某些情况下,DataNucleus 会将一个特殊的数据存储列添加到连接表中,以便集合可以允许存储重复元素。此扩展允许使用列名的规范。这应该在关系的集合端的字段中指定。JDO2 不允许这样一个规范的标准位置,扩展标签也是如此。

非常酷!'在某些情况下'。我不知道如何让我的情况不成为“某些情况”的一个子集,但我不知道如何让它发挥作用。也许有人已经遇到过“INTEGER_IDX”问题?或者(也很有可能)-我没有正确绑定数据:/

4

1 回答 1

3

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

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

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

于 2013-04-01T17:54:47.840 回答