我有常量,由其他较小的常量组成。例如
object MyConstants {
final val TABLENAME = "table_name";
final val FIELDNAME = "field_name";
final val INDEXNAME = TABLENAME + "_" + FIELDNAME + "_ix"; // this one does not want to be constant
}
我希望这些是真正的常量,因为我在注释中使用它们。
如何让它发挥作用? (关于scala 2.11)
我想要的是
interface MyConstants {
String TABLENAME = "table_name";
String FIELDNAME = "field_name";
String INDEXNAME = TABLENAME + "_" + FIELDNAME + "_ix";
}
但是在scala中。如果Scalac从java类/接口(see SI-5333)编译它们,它不会在注释中选择常量,因此我决定将它们放在scala对象中。它适用于文字和带文字的表达式,但不适用于具有其他常量的表达式。
使用此代码:
import javax.persistence.Entity
import javax.persistence.Table
import org.hibernate.annotations.Index
object MyConstants {
final val TABLENAME = "table_name";
final val FIELDNAME = "field_name";
final val INDEXNAME = TABLENAME + "_" + FIELDNAME + "_ix";
}
@Entity
@Table(name = MyConstants.TABLENAME)
@org.hibernate.annotations.Table(
appliesTo = MyConstants.TABLENAME,
indexes = Array(new Index(name = MyConstants.INDEXNAME, columnNames = Array(MyConstants.FIELDNAME))))
class MyEntity {
}
我在第indexes = ...
行
注释参数需要是常量;发现:MyConstants.INDEXNAME
编辑: 在摆弄了一些构建配置之后,我认为这实际上是一个特定于scala-ide的问题。当我使用gradle或sbt构建项目时,代码确实可以正常编译。我确实使用构建工具来实现我的实际项目,所以最后它在IDE中有一些难以理解的标记 - 很烦人,但与功能无关。
答案 0 :(得分:3)
我在JPA中使用scala中的常量。这段代码编译,我用它:
FreeDays.scala
@Entity
@Table(name = "free_days")
@NamedQueries(
Array(
new NamedQuery(name = JpaQueries.IS_FREE_DAYS, query = "SELECT f FROM FreeDays f WHERE f.dateOfFreeDay = :" + JpaQueries.DATE)
)
)
class FreeDays {
def this(id: Int, name: String, dateOfFreeDay: Date) = {
this()
this.id = id
this.name = name
this.dateOfFreeDay = dateOfFreeDay
}
@Id
@GeneratedValue
var id: Long = _
var name: String = _
@Column(name = "date_of_free_day")
@Temporal(TemporalType.DATE)
var dateOfFreeDay: Date = _
}
JpaQueries.scala
object JpaQueries extends JpaQueries
sealed trait JpaQueries {
final val IS_FREE_DAYS = "IS_FREE_DAYS"
final val DATE = "date"
}