с указанным выше отображением таблица соединения не создается.
Таблица соединения не требуется для OneToMany
, вы получите столбец внешнего ключа на стороне Много,И вот что я получаю при использовании вашего кода:
create table Person (
id bigint not null,
primary key (id)
)
create table Relationship (
id bigint not null,
personFrom_id bigint,
personTo_id bigint,
primary key (id)
)
alter table Relationship
add constraint FK499B69164A731563
foreign key (personTo_id)
references Person
alter table Relationship
add constraint FK499B691698EA8314
foreign key (personFrom_id)
references Person
Что является ожидаемым результатом (по крайней мере для меня).Возможно, что вы на самом деле хотите, это ManyToMany
.
Когда я удаляю mappedBy (@OneToMany (cascade = CascadeType.PERSIST)), создается таблица соединения, и я могу сохранять отношения через Person.Поле personFrom пустое, но я думаю, что это нормально, поскольку связь поддерживается через таблицу соединений.
Я написал небольшой модульный тест, используя предоставленный код (с API Hibernate, но это ничего не меняет), и я не понимаю, в чем проблема (сеанс создается до метода тестаи метод выполняется внутри транзакции):
Person p1 = new Person();
Person p2 = new Person();
Relationship r = new Relationship();
// create the personFrom bi-directional association
r.setPersonFrom(p1);
List<Relationship> relationships = new ArrayList<Relationship>();
relationships.add(r);
p1.setRelationships(relationships); // these four lines should be moved to some
// link management method (see update below).
// create the personTo uni-directional association
r.setPersonTo(p2);
session.persist(p2);
session.persist(p1);
assertNotNull(p2.getId());
assertNotNull(p1.getId());
assertNotNull(r.getId());
Приведенный выше код приводит к двум вставкам в таблицу Person и одной вставке в таблицу отношений (оценивая 3 столбца).
AsЯ сказал, я не понимаю проблемы.Возможно, вам следует объяснить ожидаемый результат (как для реляционной модели, так и для запросов).
Обновление: Для полной ясности при работе с двунаправленными ассоциациями необходимо установитьОбе стороны ссылки и общий шаблон - использовать методы управления защитной связью, чтобы правильно установить обе стороны ассоциации.Примерно так:
public void addToRelationships(Relationship relationship) {
if (this.relationships == null) {
this.relationships = new ArrayList<Relationship>();
}
this.relationships.add(relationship);
relationship.setPersonFrom(this);
}
Это подробно описано в разделе 1.2.6.Рабочие двунаправленные ссылки документации Hibernate.