Hibernate / JPA @AttributeOverrides不能很好地使用Groovy

时间:2017-04-07 13:41:13

标签: hibernate jpa spring-boot groovy

请注意:完整SSCCE且可重现的源代码为here on my GitHub repo。就像README说的那样,只需克​​隆并运行./gradlew clean build即可重现我所看到的错误。

我正在为 Groovy (非Java)Spring Boot应用程序设计数据模型,该应用程序将使用Hibernate / JPA向/从MySQL读取/写入实体。我的所有实体都将扩展一个抽象BaseEntity,它提供PK和另一个标识符(“refId”)。例如:

@Canonical
@Entity
@MappedSuperclass
abstract class BaseEntity {
  @Id
  Long id

  String refId
}

@Canonical
@Entity
@AttributeOverrides({
    @AttributeOverride(name = "id", column=@Column(name="customer_id")),
    @AttributeOverride(name = "refId", column=@Column(name="customer_ref_id"))
})
class Customer extends BaseEntity {
  @Column(name = "customer_name")
  String name

  @Column(name = "customer_fav_food")
  String favoriteFood
}

如您所见,因为每个实体都扩展BaseEntity,并且因为我希望每个子类/实体/表都有自己的idrefId字段的列名,所以我需要在每个子类中使用AttributeOverrides声明。

然而AttributeOverrides导致编译器问题,我无法在普通的'Java'中重现。在编译时,它会在unexpected token处抱怨n=@Column(name="customer_id")),错误。

任何人都可以复制并弄清楚发生了什么(以及解决方法是什么)?

1 个答案:

答案 0 :(得分:2)

  

然而,AttributeOverrides导致编译器问题,我无法在普通内容中重现。 Java的。

与Java的编译器不同,Groovy的编译器将{ ... }作为Closure而不是数组。您应该使用[ ... ],就像这样:

@Canonical
@Entity
@AttributeOverrides([
    @AttributeOverride(name = "id", column=@Column(name="customer_id")),
    @AttributeOverride(name = "refId", column=@Column(name="customer_ref_id"))
])
class Customer extends BaseEntity {
    // ...    
}