Использование Hibernate MapKey, который не уникален в таблице - PullRequest
1 голос
/ 10 марта 2010

Это вопрос Hibernate / JPA.

У меня есть набор Schedule объектов, каждый из которых включает в себя несколько Step s различных StepType s. Каждый StepType уникален в расписании, поэтому шаги сохраняются как Map<StepType, Step>. Код аннотируется как:

@Entity
public class Schedule implements Serializable {
    @MapKey(name="type")
    @OneToMany(cascade=CascadeType.ALL, mappedBy="schedule")
    private Map<StepType, Step> steps;
}

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"schedule", "type"})})
public class Step implements Serializable {
    @ManyToOne
    private StepType type;

    @ManyToOne
    private Schedule schedule;
}

К сожалению, это, по-видимому, запрещено. MapKey должен иметь ограничение уникальности, связанное с ним, чего нет у type, поскольку тип шага уникален только в пределах определенного расписания.

Есть ли лучший способ аннотировать эту структуру, или мне придется переосмыслить объектную модель ради Hibernate? Или это нарушение должно быть безвредным? (Карта отказывается загружаться правильно, но я не могу с уверенностью подтвердить, что именно поэтому.)

1 Ответ

0 голосов
/ 31 октября 2010

Согласно спецификации, вы правы, уникальность обязательна. Но, по мнению меня (и вас), было бы логично требовать только «локализованной уникальности». Я только что обнаружил, что в книге «Pro JPA 2» говорится одно и то же: «не обязательно быть уникальным во всем домене этого типа сущности. Он должен быть уникальным только в рамках отношений».

Мне нужно точно такое же поведение, как и вам. Я скоро проверю код.

Вот ссылка на отрывок из книги: http://books.google.com/books?id=j84hdeHH2PYC&pg=PA119&lpg=PA119&dq=jpa+mapkey+uniqueness&source=bl&ots=C_TluOiJxZ&sig=EibqwD-3slqk7pnEJDK38k4T6Zc&hl=fr&ei=147MTJLTHNC6jAecuanYBw&sa=X&oi=book_result&ct=result&resnum=9&ved=0CEgQ6AEwCA#v=onepage&q=t%20should%20also%20be%20unique%2C%20although%20it%20is%20not%20&f=false

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...