Как указать статический массив в аннотации Scala 2.8?

Я создал несколько аннотированных доменных классов в Scala 2.8.0, используя Hibernate Annotations 3.4.0. Он работает нормально, за исключением того, что есть определенные аннотации, которые принимают массив в качестве параметра. Например, вот аннотация Java, которую я хочу выразить в Scala:

@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. Помощь приветствуется.


person Isaac Oates    schedule 15.03.2010    source источник
comment
Вы пробовали cascade=Array(CascadeType.PERSIST)?   -  person Rex Kerr    schedule 15.03.2010
comment
Да. Это сработало. :-) Спасибо.   -  person Isaac Oates    schedule 15.03.2010


Ответы (2)


Я добавлю несколько фрагментов из спецификации чтобы объяснить, почему решение Рекса работает.

Для Scala на JVM аргументы аннотаций, которые будут сохранены в сгенерированном классе, должны быть постоянными выражениями:

Экземпляры класса аннотаций, наследуемого от типажа 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
person retronym    schedule 15.03.2010
comment
У меня не работает: @BeanProperty @Id @GeneratedValue(strategy=Array(GenerationType.IDENTITY)) var id: Long = _ выдает ошибку: найдена константа массива, ожидаемый аргумент типа javax.persistence.GenerationType - person Hendy Irawan; 13.04.2011
comment
Параметр аннотации strategy принимает только одно значение, как предполагает ошибка компилятора. download.oracle.com/javaee/5/api/javax/ постоянство/ strategy=GenerationType.IDENTITY должно помочь. - person retronym; 14.04.2011

От Рекса Керра:

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

Это сработало. Спасибо.

person Isaac Oates    schedule 15.03.2010