Я пристраивал некоторые аннотируемые доменные классы в Scala, 2.8.0 использований В спящем режиме Аннотации 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. Справка ценится.
Я добавлю несколько фрагментов из спецификации , чтобы объяснить, почему решение Рекса работает.
Для 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
От Рекса Керра:
@OneToMany(mappedBy="passport_id", cascade=Array(CascadeType.PERSIST))
Это сработало. Спасибо.