2010-03-15 8 views
11

Tôi đã xây dựng một số lớp miền có chú thích trong Scala 2.8.0 bằng cách sử dụng Chú thích Hibernate 3.4.0. Nó hoạt động tốt, ngoại trừ việc có một số chú thích nhất định lấy một mảng làm tham số. Ví dụ, đây là một chú thích Java mà tôi muốn thể hiện trong Scala:Làm cách nào để chỉ định một mảng tĩnh trong chú thích Scala 2.8?

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

Tuy nhiên, chú thích đòi hỏi một mảng/thiết lập như là đầu vào:

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

Tôi đã thử ngoặc khác nhau, hình vuông/góc/dấu ngoặc nhọn, v.v.:

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

... nhưng tiếc là tôi đã kết thúc sự hiểu biết về chú thích Scala/Java. Trợ giúp được đánh giá cao.

+5

Bạn đã thử 'cascade = Array (CascadeType.PERSIST)'? –

+0

Có. Nó đã làm việc. :-) Cảm ơn bạn. –

Trả lời

14

Tôi sẽ thêm một vài đoạn từ spec để giải thích lý do giải pháp của Rex hoạt động.

Đối Scala trên JVM, lập luận để chú thích sẽ được giữ lại trong các lớp được tạo ra phải là biểu thức hằng số:

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.

biểu thức liên tục là gì?

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

Bạn cũng có thể cấu trúc lại đối số thành final val. Điều này dường như không làm việc cho mảng, tuy nhiên. Tôi sẽ gây ra lỗi.

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

Không hoạt động cho tôi: @BeanProperty @Id @GeneratedValue (strategy = Array (GenerationType.IDENTITY)) var id: Long = _ cung cấp lỗi: tìm thấy hằng số mảng, đối số dự kiến ​​của loại javax.persistence.GenerationType –

+1

Tham số chú thích 'chiến lược' chỉ chấp nhận một giá trị duy nhất, như được đề xuất bởi lỗi trình biên dịch. http://download.oracle.com/javaee/5/api/javax/persistence/GeneratedValue.html 'strategy = GenerationType.IDENTITY' nên thực hiện thủ thuật. – retronym

+0

Họ vẫn đang băn khoăn. http://stackoverflow.com/q/19060918/1296806 –

8

Từ Rex Kerr:

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

này làm việc. Cảm ơn.