По умолчанию @OneToMany
создаст таблицу соединения только в том случае, если вы будете использовать однонаправленные отношения .
Другими словами, если у вас есть Employee
и Project
сущности иEmployee
сущность определяется следующим образом: (предположим, что для этих сущностей нет записей orm.xml
) :
@Entity
public class Employee {
// ...
@OneToMany
Set<Project> projects;
}
@Entity
public class Project {
// ...
}
поставщик JPA создаст таблицу соединения (обратите внимание, что в аннотации @OneToMany
отсутствует атрибут mappedBy
, поскольку в Project
нет ссылки на Employee
сущность).
С другой стороны, если вы будете использовать двунаправленныйотношение:
@Entity
public class Employee {
// ...
@OneToMany(mappedBy="employee")
Set<Project> projects;
}
@Entity
public class Project {
// ...
@ManyToOne
Employee employee;
}
Таблица соединения не будет использоваться, поскольку для хранения внешнего ключа для этого отношения будет использоваться сторона "много".
Однако вы можете принудительно использовать таблицу соединений даже в тех случаях, когда у вас есть двунаправленная связь @OneToMany
с определенным атрибутом mappedBy
.Вы можете достичь этого, используя аннотацию @JoinTable
на стороне-владельце отношений.
Существует также возможность, как вы упомянули, использовать @JoinColumn
в случае соединенияТаблица будет использоваться по умолчанию (однонаправленное отношение @OneToMany
).
Лучше всего проверить FK и разницу в производительности таблицы соединения для себя.Я могу только предположить, что меньшее количество объединений (в данном случае: FK), кажется, имеет лучшую производительность.
Более того, иногда администратор баз данных определяет схему базы данных, и вам просто нужно приспособить ваши сопоставления к существующей схеме.Тогда у вас нет выбора над FK или столом присоединения - вот почему у вас есть выбор.