JPA:映射 Map<Enum, Entity>

标签 jpa eclipselink

我想在 JPA 中映射 map ,但出现异常: 我的 java 代码如下所示:

问题.java:

@ElementCollection
@CollectionTable(
    name="ISSUE_EMPLOYEE",
    joinColumns=@JoinColumn(name="ISSUE_ID", referencedColumnName="ID")
)
@MapKeyColumn(name="EMPLOYEEPOSITION_ID")
@MapKeyConvert("myEnumConverter")
@JoinColumn(name="EMPLOYEE_ID")
private Map<EmployeePosition, Employee> namedEmployees = new Hashtable<EmployeePosition, Employee>();

EmployeePosition 是一个 EnumEmployee 是一个 Entity

我得到这个异常:

Internal Exception: java.sql.SQLException: ORA-00904: "EMPLOYEES": invalid identifier

Error Code: 904 Call: INSERT INTO ISSUE_EMPLOYEE (ISSUE_ID, EMPLOYEES, EMPLOYEEPOSITION_ID) VALUES (?, ?, ?) bind => [27, [B@18b85d, SERVICE]

它似乎忽略了@JoinColumn注释并尝试将对象插入数据库中。 我的映射出了什么问题/是否可以匹配这样的实体?

最佳答案

据我了解,当 Map 的值是实体时,您需要 @OneToMany 而不是 @ElementCollection 。像这样的事情:

@OneToMany
@JoinTable(name = "ISSUE_EMPLOYEE",
    joinColumn = @JoinColumn(name = "ISSUE_ID"),
    inverseJoinColumn = @JoinColumn("EMPLOYEE_ID"))
@MapKeyColumn(name="EMPLOYEEPOSITION_ID") 
private Map<EmployeePosition, Employee> namedEmployees = new Hashtable<EmployeePosition, Employee>(); 

编辑:上面的映射在 Hibernate 中工作正常,但在 EclipseLink 中不起作用。 ISSUE_EMPLOYEE 中的 EMPLOYEEPOSITION_ID 列已创建,但未在查询中使用。它不仅发生在枚举键上,也发生在其他原始类型上。

它看起来像是 EclipseLink 中的一个错误。我在 their Bugzilla 中找不到,所以也许举报会更好。

关于JPA:映射 Map<Enum, Entity>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4955545/

相关文章:

java - JAXB 2.x : Marshalling puts element value twice into the XML

java - 将 JPA Eclipse Link 查询结果映射到 POJO

jpa - 通过 Spring Data JPA 执行批量更新时如何更新 @Version 字段

java - 方法 JPQL 的查询验证失败

java - 在 Controller Spring MVC中控制异常流

java - 如何使用 JPA/EclipseLink 与联结表建立多对多关系

jaxb - 使用 MOXy 解析混合标记,也许使用 Transformers

java - native EclipseLink : enable second level cache for some entities

java - Hibernate 使用列名作为属性名

java - EJB3 应用程序的具有简单 URL 的最佳 View 层