11

我一直在使用 Hibernate Annotations 3.4.0 在 Scala 2.8.0 中构建一些带注释的域类。它一直工作正常,除了某些注释将数组作为参数。例如,这是我想在 Scala 中表达的 Java 注释:

@OneToMany(mappedBy="passport_id", cascade=CascadeType.PERSIST)

但是,注释需要一个数组/集作为输入:

[ERROR] .../Passport.scala:50: error: type mismatch; 
[INFO]  found   : javax.persistence.CascadeType(value PERSIST)
[INFO]  required: Array[javax.persistence.CascadeType]
[INFO]     @OneToMany(mappedBy="passport_id", cascade=CascadeType.PERSIST)

我尝试了各种括号、方括号/角括号/大括号等:

@OneToMany(mappedBy="passport_id", cascade=(CascadeType.PERSIST))
@OneToMany(mappedBy="passport_id", cascade=[CascadeType.PERSIST])
@OneToMany(mappedBy="passport_id", cascade=<CascadeType.PERSIST>)
@OneToMany(mappedBy="passport_id", cascade={CascadeType.PERSIST})

...但不幸的是,我对 Scala/Java 注释的理解已经走到了尽头。帮助表示赞赏。

4

2 回答 2

14

我将从规范中添加一些片段来解释为什么 Rex 的解决方案有效。

对于 JVM 上的 Scala,将保留在生成的类中的注释的参数必须是常量表达式:

从 trait scala.ClassfileAnnotation 继承的注释类的实例将存储在生成的类文件中。...此外,在 Java 和 .NET 上,所有构造函数参数都必须是常量表达式。

什么是常量表达式?

6.24常量表达式 常量表达式是 Scala 编译器可以计算为常量的表达式。“常量表达式”的定义取决于平台,但它们至少包括以下形式的表达式:

  • 值类的文字,例如整数
  • 字符串文字
  • 使用 Predef.classOf (§12.4) 构造的类
  • 来自底层平台的枚举元素
  • 一个字面量数组,形式为 Array(c1, . . . , cn),其中所有 ci 本身都是常量表达式
  • 由常量值定义(第 4.1 节)定义的标识符。

您还应该能够将参数重构为 a final val。然而,这似乎不适用于数组。我会提出一个错误。

class T(value: Any) extends ClassfileAnnotation

object Holder {
   final val as = Array(1, 2, 3)
   final val a = 1
} 

@T(Holder.a)
@T(Holder.as)  // annot.scala:9: error: annotation argument needs to be a constant; found: Holder.as
class Target
于 2010-03-15T17:19:42.370 回答
8

从雷克斯克尔:

@OneToMany(mappedBy="passport_id", cascade=Array(CascadeType.PERSIST))

这行得通。谢谢。

于 2010-03-15T16:59:20.907 回答