【问题标题】:How do I specify a static array in a Scala 2.8 annotation?如何在 Scala 2.8 注释中指定静态数组?
【发布时间】:2011-01-27 17:58:30
【问题描述】:

我一直在使用 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 注释的理解已经走到了尽头。感谢您的帮助。

【问题讨论】:

  • 你试过cascade=Array(CascadeType.PERSIST)吗?
  • 是的。有效。 :-) 谢谢。

标签: java scala annotations scala-2.8


【解决方案1】:

来自雷克斯·科尔:

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

这行得通。谢谢。

【讨论】:

    【解决方案2】:

    我将添加来自spec 的一些sn-ps 来解释Rex 的解决方案为何有效。

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

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

    什么是常量表达式?

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

    • 值类的文字,例如整数
    • 字符串文字
    • 使用 Predef.classOf (§12.4) 构造的类
    • 来自底层平台的枚举元素
    • 一个字面量数组,形式为 Array(c1, . . . , cn),其中所有 的 ci 本身是常数 表达式
    • 由常量值定义 (§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
    

    【讨论】:

    • 对我不起作用:@BeanProperty @Id @GeneratedValue(strategy=Array(GenerationType.IDENTITY)) var id: Long = _ 给出错误:找到数组常量,预期参数为 javax 类型。 persistence.GenerationType
    • 注解参数strategy 只接受一个值,正如编译器错误所提示的那样。 download.oracle.com/javaee/5/api/javax/persistence/… strategy=GenerationType.IDENTITY 应该可以解决问题。
    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多