JPA: карта карты <Enum, Entity> - PullRequest
       0

JPA: карта карты <Enum, Entity>

2 голосов
/ 10 февраля 2011

Я хочу отобразить карту в JPA, но получаю исключение: мой java-код выглядит так:

Issue.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 являетсяEnum и Employee - это Entity.

Я получаю это исключение:

Внутреннее исключение: java.sql.SQLException: ORA-00904: «СОТРУДНИКИ»:неверный идентификатор

Код ошибки: 904 Вызов: INSERT INTO ISSUE_EMPLOYEE (ISSUE_ID, EMPLOYEES, EMPLOYEEPOSITION_ID) VALUES (?,?,?) bind => [27, [B @ 18b85d, SERVICE]

Кажется, он игнорирует аннотацию @JoinColumn и пытается вставить объект в БД.Что не так с моим отображением / Возможно ли сопоставить сущности, подобные этой?

1 Ответ

4 голосов
/ 10 февраля 2011

Насколько я понимаю, вам нужно @OneToMany вместо @ElementCollection, когда значение Map является сущностью. Примерно так:

@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. Столбец EMPLOYEEPOSITION_ID в ISSUE_EMPLOYEE создан, но не используется в запросах. Это происходит не только с ключами enum, но и с другими примитивными типами.

Похоже, ошибка в EclipseLink. Я не могу найти в их Bugzilla , поэтому, возможно, было бы лучше сообщить об этом.

...