【问题标题】:DataNucleus Enhancer, JDO and Specifying Column NamesDataNucleus 增强器、JDO 和指定列名
【发布时间】:2010-02-27 14:25:41
【问题描述】:

作为 Google App Engine 项目的一部分,我正在使用 DataNucleus,但我在持久化列方面遇到了一些问题。

@PrimaryKey(column = "user_id")
@Column(name = "user_id")
@Persistent(name = "user_id", column = "user_id", valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key m_id;

@Column(name = "user_name")
@Persistent(name = "user_name", column = "user_name")
private String m_userName;

如果您看不出来,我试图将列命名为与变量名称不同的名称,因为我有两种命名约定(一种在 Java 中效果更好,一种在 SQL 中效果更好)。无论如何,我已经尝试了这些标记注释的所有变体,但 DataNucleus 增强器拒绝尊重它们中的任何一个,所以当我运行这样的查询时:

Query q = pm.newQuery(User.class,
                      "user_name == _username");

我总是收到这样的错误:

org.datanucleus.store.appengine.FatalNucleusUserException:解析查询时出现意外的表达式类型。您确定您的对象上存在名为 user_name 的字段吗?

当然,当运行这样的查询时:

Query q = pm.newQuery(User.class,
                      "m_userName == _username");

...一切都很好。因此,如果这些注释中的任何一个被兑现,就会有一个名为 user_name 的字段,但显然不是。

SO 我的问题是:有没有办法将我在查询中使用的标记与字段名称分离?我正在寻找无需手动编辑查询即可更改字段名称的功能。

注意:我宁愿在 Java 类中使用我的 SQL 命名约定,也不愿手工编写大量的 XML,所以这必须通过注释来完成。

【问题讨论】:

    标签: java google-app-engine annotations jdo datanucleus


    【解决方案1】:

    不知道谈论 SQL,您使用的是 GAE/J,因此使用的是 BigTable 而不是 RDBMS,因此 SQL 无法正常工作。 @Column 可能什么都不做,因为它用于 ORM。在这里,您使用 JDOQL 作为查询语言,因此您使用字段名称……因为它是一种面向对象 查询语言。这不是 SQL。你讨厌“这个”? JDOQL 使用 Java 语法,因此“this”很有意义。

    如果您真的想要一个允许重构的类型安全查询扩展,那么 QueryDSL 提供了 JDOQL 以与 DataNucleus 一起使用。

    PS DataNucleus 增强器与列名无关。根据 JDO 规范,它只是添加了用于检测字段更新的额外方法。

    【讨论】:

    【解决方案2】:

    不是 100% 确定我明白你的问题是什么。如果您在查询中使用m_userName,它是否会在 SQL 查询中被翻译为user_name

    您根据 java 类名和变量表达您的查询,并且它们根据 SQL 模式表和列名被翻译为工作。这是大多数时候人们想要的。

    顺便说一句,m_idm_userName 是 Java 代码的糟糕命名约定。我强烈建议您遵循通常的convention

    【讨论】:

    • 啊,我明白了……所以我误解了注释的实际作用。实际的支持列使用注释命名,而我仍然使用私有成员的名称进行查询。这样的封装不会破坏吗?我的意思是,现在我不能随意更改变量的名称,而无需搜索所有字符串查询并手动更改它们。有什么方法可以将我在查询中使用的单词与私有成员的名称隔离开来?抱歉,我并没有放弃 m_ 约定,我讨厌 this. gobbledygook。
    • 我猜你可以注释 getter 和 setter 而不是字段。尽管如此,如果你重命名 getter 和 setter,这会对代码产生深远的影响(不仅仅是查询)。重构工具可以帮助更改以一致方式引用方法的所有位置,包括在字符串中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    相关资源
    最近更新 更多