Hibernate/JPA @AttributeOverrides 与 Groovy 不能很好地配合

标签 hibernate jpa spring-boot groovy

请注意:完整SSCCE可复制的源代码是 here on my GitHub repo 。就像自述文件所说,只需克隆并运行 ./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,并且因为我希望每个子类/实体/表都有自己的 id 列名称>refId 字段,我需要在每个子类中使用该 AttributeOverrides 声明。

但是 AttributeOverrides 导致编译器问题,我无法在普通的 ole' Java 中重现该问题。在编译时,它会在 n=@Column(name="customer_id")), 处提示 unexpected token 错误。

任何人都可以重现并弄清楚发生了什么(以及修复方法是什么)吗?

最佳答案

However AttributeOverrides is causing a compiler issue that I can't reproduce in plain ole' 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 {
    // ...    
}

关于Hibernate/JPA @AttributeOverrides 与 Groovy 不能很好地配合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43279688/

相关文章:

Eclipse:持久性单元中未定义名为 "system-uuid"的生成器

java - Hibernate 中的 SortedMap 键持久化

java - 使用启用了符合 JPA 的事务访问的 JTA 时无法访问事务

Javascript:是否可以将字符串转换为数组的数组?

Java StompSession 发送消息 - Spring Boot

c# - (N)Hibernate 从 schema : Object <- AttributeValue -> Attribute 查找内容

java - Hibernate - 选择表格中的所有行

java - 关联引用未映射的 Hibernate 类

java - JPA错误: Transaction is currently active

java - Spring Boot Hibernate、CriteriaBuilder