我一直在尝试在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_COMMENT
,ORDER_DATE
,STATUS
,CUSTOMER_ID
,ORDERS_INTEGER_IDX
) VALUES(?,?,?,?,?)“失败:未知列'ORDERS_INTEGER_IDX'在 '字段列表'
不知何故DataNucleus假设,有一个列ORDERS_INTEGER_IDX(数据库中不存在这样的列)。我想到的唯一想法是http://www.datanucleus.org/products/datanucleus/jdo/metadata_xml.html
在某些情况下,DataNucleus会添加一个特殊的数据存储列 连接表,以便集合可以允许存储重复 元素。此扩展允许指定列名称 要使用的。这应该在该字段中指定 收集结束的关系。 JDO2不允许标准的地方 对于这样的规范,扩展标记也是如此。
太酷了! '在某些情况下'。我不知道如何让我的情况不是“某些情况”的一个子集,但我不知道如何让这个工作。也许某人已经遇到了“INTEGER_IDX”问题?或者(也很有可能) - 我没有正确地绑定数据:/
答案 0 :(得分:3)
所以你自己创建架构。您的架构与元数据不一致。您可以在不根据模式验证元数据的情况下运行持久性,并且会产生异常。 DataNucleus为您提供SchemaTool,以根据您的元数据创建或验证架构,这意味着您可以检测到问题。
您正在使用索引列表,因此它需要每个元素的索引(或者如何知道元素所处的位置?)。怎么能假设有一个索引?好吧,这是一个叫做JDO规范(公开可用)的东西,它定义了索引列表。如果你不想存储元素的位置,那么不要使用List(用于保留元素位置的Java util类)...所以我建议使用Set,因为它不需要位置信息(因此没有索引)。
您还有一个标记为数据存储区标识的类,然后有一个主键。这是一个矛盾...你有一个或另一个。文档定义所有这些,以及如何具有1-N列表关系(“JDO API” - &gt;“映射” - &gt;“字段/属性” - &gt;“1-N关系” - &gt; “列表”或“集”)