Datanucleus/JDO,持久化和检索 java.util.Set 属性

Posted

技术标签:

【中文标题】Datanucleus/JDO,持久化和检索 java.util.Set 属性【英文标题】:Datanucleus/JDO, persisting and retrieving java.util.Set attribute 【发布时间】:2011-06-10 21:33:31 【问题描述】:

我的持久类中有一个 Set 类型的属性。我坚持到 H2 数据库。该类正确保留,我可以使用 H2 控制台查看数据并查看 Set 属性已被序列化以进行存储,这没关系,直到我尝试检索对象,我的属性始终为空。我尝试添加注释以阻止它被序列化并将其添加到默认提取组但没有成功。我想我真的不明白我需要添加哪些来阻止它被序列化。我实际上并不关心它是否被序列化,只要我可以重建 Set 并访问它的成员。

任何人都可以指出一个简单的示例,该示例使用 Datanucleus 进行持久化,带或不带序列化,以及我需要反序列化数据的任何特殊代码。

编辑:这里是一些代码,首先是我要坚持的类,

@PersistenceCapable
public class Track 
private Set<String> fts;
private String name="";

public void setName(String name) 
    this.name = name;


public String getName() 
    return name;


public void setFts(Set<String> fts) 
    this.fts = fts;


public Set<String> getFts() 
    return fts;


我的 orm 文件的摘录

    <class name="Track" identity-type="datastore" table="JDO_TRACK">
        <inheritance strategy="new-table"/>
        <field name="name" primary-key="true">
            <column jdbc-type="VARCHAR" name="name"/>
        </field>
        <field name="fts" default-fetch-group="true" persistence-modifier="persistent">
            <collection element-type="java.lang.String" dependent-element="true" serialised-element="false"/>
            <element column="fts"/>

        </field>
    </class>

和我查询数据存储的方法,我想在 fts 属性中获取具有特定值的 Track 对象。此示例查询一个字符串,但在现实生活中,我需要使用 AND (&&) 对多个字符串执行此操作(注意,这在 GAE/J 上运行良好,因此对于我的本地测试环境,我使用 Datanucleus 1.1.5)

private Track retrieveFTS(String criteria) 
    PersistenceManagerFactory pmf = JDOHelper
            .getPersistenceManagerFactory("datanucleus.properties");

    PersistenceManager pm = pmf.getPersistenceManager();
    Track res = null;
    try 
        System.out.println("Querying with criteria:" + criteria);
        Query q = pm.newQuery(mseries.routes.gpx.Track.class);
        q.setFilter("fts.toUpperCase() == criteria ");
        q.declareParameters("String criteria");
        q.setUnique(true);
        q.setOrdering("name ascending");
        res = (Track) q.execute(criteria.toUpperCase());
     finally 
        pm.close();
    
    return res;

以及我收到的异常

javax.jdo.JDOFatalUserException:无法在序列化时查询集合/映射字段(“mseries.routes.gpx.Track.fts”)。要么更改您的查询,要么将字段更改为不被序列化。 在 org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:354)

【问题讨论】:

【参考方案1】:

如果在 GAE/J 环境中使用,那么您最好将您的问题标记为那个。 如果在 GAE/J 之外使用,那么您没有理由使用这种古老且不受支持的 DataNucleus 版本,即使用 v3.0

如果您不希望 Set 被序列化,那么您最好包含 因为否则您不允许它成为连接表,因此它必须对其进行序列化

【讨论】:

我的问题不是关于 GAE/J - 它使用从某人那里复制的一些代码在那里工作。我想知道如何在其他环境中为 H2 和其他 RDBMS 解决这个问题。您说“最好建议您包含,否则您不允许它成为连接表,因此必须对其进行序列化”,恐怕我不明白这是什么意思,您的意思是包含某种加入并使其创建一个连接表并将 fts 字符串放在连接表中?新版本的 DN 会让这一切变得更容易吗? 编辑吞下了<join/>在回复中,现在已修复。除了连接表之外,您还希望将 Set 存储在哪里?所有这些都符合 JDO 规范

以上是关于Datanucleus/JDO,持久化和检索 java.util.Set 属性的主要内容,如果未能解决你的问题,请参考以下文章

Datanucleus:从@Transactional 迁移到非事务性

EI检索期刊JA检索与CA检索有什么区别?

JA17-大型电商分布式系统应用实践+性能优化+分布式应用架构+负载均衡+高并发设计+持久化存储视频教程

Java_MyBatis

为啥 BotUserData 在我的 Bot Framework 机器人中不能持久化和可检索?

Android - 持久化从 Firebase 检索到的数据