Подтвердить что ты не робот

Как указать статический массив в аннотации 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. Помощь приветствуется.

4b9b3361

Ответ 1

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

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

Экземпляры класса аннотации, унаследовавшего от свойства scala.ClassfileAnnotation будет храниться в сгенерированных файлах классов.... Кроме того, на Java и .NET все аргументы конструктора должны быть постоянными выражениями.

Что такое постоянные выражения?

6.24 Константные выражения Константные выражения - это выражения, которые Scala компилятор может оценить постоянная. Определение "константа выражение" зависит от платформы, но они включают по крайней мере выражения следующих форм:

  • Литерал класса значений, такого как целое число
  • Строковый литерал
  • Класс, построенный с помощью Predef.classOf(§12.4)
  • Элемент перечисления с базовой платформы
  • Литеральный массив формы Array (c1,..., cn), где все ci s сами по себе постоянны выражения
  • Идентификатор, определяемый определением константы (§ 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

Ответ 2

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

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

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