2

我正在开发现有 Java ORM (Ebean) 的 Scala 扩展。该项目的目标是为 ORM 添加尽可能多的类型安全性。代替

Ebean.find(Product.class).fetch("name", "unit").findList()

我终于希望能够写出类似的东西

(objects of entity[Product] with attributes name and unit) getIt

(请注意,这只是第一个 DSL 方法)。

ORM 模型已经定义为

@Entity
public class {
    public String name;
    public String unit;
}

为了在编译时为查询中的属性实现类型安全,我需要在例如(new Product()).name.

我认为这是确保仅使用该类中存在的此类模型成员的最佳方法,但是,在运行时,我需要一种方法来识别该变量已被访问。否则我只会打电话给那个成员name,而不会在我的查询中知道这一点。

有谁知道如何实现这一目标?是否有可能跟踪访问变量的时间并在运行时将该信息提供给任何其他对象?

我已经考虑过使用 getter 和 setter,而不是在模型类中使用公共成员,但这会使查询或模型变得非常难看。另一个问题是必须为每个模型手动添加任何额外的特定方法。

如果有人能提出可能的解决方案,我会很高兴。谢谢!

4

2 回答 2

1

如果您愿意将模型对象的字段定义为类似 Record Fields 的内容,那么 Emil 的建议可能会奏效,但如果您使用自定义类型在 Java ORM 之上构建解决方案可能会成为问题。如果您需要跟踪字段访问,我认为您最好的选择是使用CGLibJavassist之类的库进行运行时字节码检测。您可以将经过检测的“虚拟”对象传递到函数的主体中,然后跟踪在本地线程中访问了哪个字段。这就是它在Squeryl中的完成方式。

于 2012-06-07T15:59:54.713 回答
0

你可以看看 Lift 的人是如何实现Mapper和 Records 的。它允许使用伴随对象(以及使用原始 sql)进行类型安全查询。它确实需要将特征继承到您的模型中,并且字段被指定为对象而不是常规 val。不过可能会有所帮助。您可以在此处找到持久性内容的来源。

于 2012-06-06T18:49:46.347 回答