2010-03-15 52 views
11

我一直在使用Hibernate Annotations 3.4.0在Scala 2.8.0中构建一些带注释的域类。它一直工作正常,除了有某些注释将数组作为参数。例如,这里就是我想在Scala中表达一个Java注解:如何在Scala 2.8注释中指定一个静态数组?

@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注释理解的最后。帮助表示赞赏。

+5

你试过cascade = Array(CascadeType.PERSIST)吗? – 2010-03-15 15:58:11

+0

是的。有效。 :-) 谢谢。 – 2010-03-15 16:58:21

回答

14

我会从spec中添加一些片段来解释雷克斯解决方案的原因。

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

Instances of an annotation class inheriting from trait scala.ClassfileAnnotation will be stored in the generated class files. ... Additionally, on both Java and .NET, all constructor arguments must be constant expressions.

什么是常量表达式?

6.24 Constant Expressions Constant expressions are expressions that the Scala compiler can evaluate to a constant. The definition of “constant expression” depends on the platform, but they include at least the expressions of the following forms:

  • A literal of a value class, such as an integer
  • A string literal
  • A class constructed with Predef.classOf (§12.4)
  • An element of an enumeration from the underlying platform
  • A literal array, of the form Array(c1, . . . , cn), where all of the ci ’s are themselves constant expressions
  • An identifier defined by a constant value definition (§4.1).

您还应该能够将参数重构为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 
+0

不适用于我:@BeanProperty @Id @GeneratedValue(strategy = Array(GenerationType.IDENTITY))var id:Long = _给出错误:找到数组常量,期望的参数类型为javax.persistence.GenerationType – 2011-04-13 18:11:51

+1

注释参数正如编译器错误所建议的,“strategy”只接受单个值。 http://download.oracle.com/javaee/5/api/javax/persistence/GeneratedValue.html'strategy = GenerationType.IDENTITY'应该做到这一点。 – retronym 2011-04-13 20:57:16

+0

他们仍然在想。 http://stackoverflow.com/q/19060918/1296806 – 2013-09-28 04:34:18

8

雷克斯克尔:

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

这个工作。谢谢。