2012-02-14 4 views
1

Я работаю над набором совместимости JPA для моей стажировки ... Часть этого набора включает в себя тестирование правильной реализации угловых случаев.@ ManyToMany/@ OneToMany атрибут mappedby для двунаправленной ассоциации

@ManyToMany имеет атрибут mappedBy. JPA заявляет, что:

String mappedBy - поле или свойство, которому принадлежат отношения. Требуется, если связь не является однонаправленной.

Значение по умолчанию не задано - столбец по умолчанию пуст.

Учитывая двунаправленный @ManyToMany - этот пример из самой спецификации JPA 2.0 JSR-317!

Клиент

@ManyToMany 
@JoinTable(name="CUST_PHONES") 
public Set<PhoneNumber> getPhones() { return phones; } 

PhoneNumber

@ManyToMany(mappedBy="phones") 
public Set<Customer> getCustomers() { return customers; } 

Атрибут mappedBy не был определен в @ManyToMany из Customer! Есть ли по умолчанию для двунаправленных сопоставлений, о которых я не знаю, или что?

я смотрел на подобные случаи и нашел: @OneToOne - mappedBy не является обязательным, по умолчанию не @OneToMany - точно так же, как и @ManyToMany (mappedBy не является обязательным для двунаправленной, не по умолчанию)

Короче говоря, мой вопрос : Для @ManyToMany и @OneToMany, что должно быть помещено в атрибут mappedBy для владельца стороны отношения (Customer в примере)?

ответ

1

Это далеко не угловой корпус. Каждая двунаправленная ассоциация имеет сторону владельца и обратную сторону.

JPA использует владельца, чтобы решить, существует ли связь между двумя объектами. Другая сторона игнорируется.

Собственная сторона - это та, которая определяет, как ассоциация сопоставляется (используя аннотации JoinColumn, JoinTable и т. Д.). У него нет никакого атрибута mappedBy.

Обратная сторона использует атрибут mappedBy, чтобы сказать: «Привет, я всего лишь обратная ассоциация того, что отображается следующим свойством».

Таким образом, по определению собственная сторона не имеет атрибута mappedBy. Если бы он был один, это не было бы стороной, владеющей.

Это хорошо объяснено в JPA spec. Если вам нужно создать комплект соответствия для этой спецификации, вам лучше его прочитать и понять.

Я не вижу смысла писать такой набор сговорчивость так, как написано на JPA2 JSR home page,

В соответствии с требованиями Соглашения об участии в спецификации Java (АПО), Java Persistence API, версия 2.0 TCK будет лицензирована без платы за без поддержки квалифицированных некоммерческих организаций. Такая квалификация будет проверена с помощью программы тестирования совместимости . Поддержка также может быть предоставлена ​​бесплатно с одобрения стипендиального совета . Для получения дополнительной информации см. : http://java.sun.com/scholarship/.

+0

Комплект совместимости - просто причудливое название для модульных испытаний аннотаций, используемых JPA. Сейчас основное внимание уделяется ORM ... вы говорите, что эти модульные тесты (или что-то еще по этим строкам) уже существуют? Компания, у меня есть стажировка, хочет, чтобы я разработал это как часть тестирования своего приложения с открытым исходным кодом. Я как бы понимаю использование 'mappedBy', я просто смущен относительно его точной формулировки. Почему он говорит, что аннотация mappedBy требуется для не-однонаправленных отношений без исключения принадлежащей стороне двунаправленного отношения? – Pimgd

+0

TCK используется для проверки реализации JPA. Он не используется для тестирования приложения, созданного с помощью JPA. Поэтому я предполагаю, что ваш комплект может быть полезен. Вероятно, это так говорит, потому что разработчик ленив и думал, что пользователи аннотации будут читать спецификацию JPA или javadoc самой аннотации, где подробно объясняется использование атрибута mappedBy. –

+0

", где подробно объясняется использование атрибута mappedBy." Не могли бы вы дать мне ссылку на эту документацию? Я могу найти некоторые из них в Интернете, но, похоже, попугай, что я могу прочитать в спецификации JSR-317 ... и не проливает свет на эту конкретную ситуацию. – Pimgd

Смежные вопросы