2010-03-15 12 views
11

He estado construyendo algunas clases de dominio anotadas en Scala 2.8.0 usando Hibernate Annotations 3.4.0. Ha funcionado bien, excepto que hay ciertas anotaciones que toman una matriz como parámetro. Por ejemplo, he aquí una anotación de Java que quiero expresar en Scala:¿Cómo especifico una matriz estática en una anotación de Scala 2.8?

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

Sin embargo, la anotación requiere una matriz/set como entrada:

[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) 

que he probado varios paréntesis, cuadrado/ángulo/llaves, y así sucesivamente:

@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}) 

... pero por desgracia hemos llegado al final de mi comprensión de anotaciones Scala/Java. La ayuda es apreciada.

+5

¿Has intentado 'cascade = Array (CascadeType.PERSIST)'? –

+0

Sí. Funcionó. :-) Gracias. –

Respuesta

14

Voy a agregar algunos fragmentos del spec para explicar por qué funciona la solución de Rex.

Para Scala en la JVM, los argumentos a las anotaciones que se conservan dentro de la clase generada debe ser expresiones constantes:

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.

¿Cuáles son expresiones constantes?

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).

También debe ser capaz de refactorizar el argumento de una final val. Sin embargo, esto no parece funcionar para Arrays. Voy a plantear un error.

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

No funciona para mí: @BeanProperty @Id @GeneratedValue (strategy = Array (GenerationType.IDENTITY)) id var: Long = _ da error: matriz encontrada constante, argumento esperado de tipo javax.persistence.GenerationType –

+1

El parámetro de anotación 'strategy' solo acepta un único valor, como lo sugiere el error del compilador. http://download.oracle.com/javaee/5/api/javax/persistence/GeneratedValue.html 'strategy = GenerationType.IDENTITY' debe hacer el truco. – retronym

+0

Todavía se lo están preguntando. http://stackoverflow.com/q/19060918/1296806 –

8

De Rex Kerr:

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

Esto funcionó. Gracias.

Cuestiones relacionadas